【问题标题】:Nested hash parameters in URL - CGIURL 中的嵌套哈希参数 - CGI
【发布时间】:2016-09-09 21:45:11
【问题描述】:

如何将嵌套的哈希参数传递到 CGI 脚本的 URL? 数据:

my $params = {
    pwd => 'abc',
    usr => 'abb',
    data => { xyz => 'xxx' },
};

我试过了:

<URI>?pwd=abc&usr=abb&data[xyz]='xxx'

但这会导致:

$VAR1 = { 
   'data[yxz]'     => 'xxx',
   'pwd'           => 'abc',
   'usr'           => 'abb'
}

感谢任何提示。

注意:好的,我可以解析字符串'data[yxz]'并将整个对转换为hashref,但我想知道是否有任何'native'函数。

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

    没有。

    没有本地方式可以做到这一点。如果您使用的是CGI.pm,那么您可以传递多个同名参数并将它们全部提取到一个数组中。

    GET /?foo=1&foo=2&foo=3
    
    use strict;
    use warnings;
    use CGI;
    use Data::Dumper;
    
    my $q = CGI->new;
    my @foo = $q->multi_param('foo');
    
    print Dumper \@foo;
    

    您将通过具有相同name 属性的多个输入字段从HTML 表单实现这种行为。但这不会给你一个哈希值。


    要传递一个实际的数据结构,但这还不够。 您可以将多维参数编码为 JSON。

    <URI>?pwd=abc&usr=abb&data={'yxz':'xxx'}
    

    正确的 URL 编码如下。

    ?pwd=abc&usr=abb&data=%7B%27yxz%27%3A%27xxx%27%7D
    

    在您的应用程序中,您可以使用 JSON 模块将其从 JSON 转换为 Perl 数据结构。

    【讨论】:

    • @Quentin 我认为 CGI.pm 是否在核心中对于这个问题并不重要。但是我会详细说明我的意思。
    • 使用 JSON 而不是问题所问的数据格式意味着从可以使用 HTML 表单生成的格式更改为无法生成的格式。
    • @Quenin 我不认为 OP 想要那种数据格式。他们只是试了一下。毕竟他们首先在谈论 Perl hashref。
    • 我试图减少问题并尽可能简单。你的回答“不”对我来说绝对没问题:)
    【解决方案2】:

    查询字符串只是一个字符串。您可以以任何您喜欢的方式对数据进行编码,并使用您喜欢的任何解析器将其转换为数据结构。

    大多数解析器会为您提供键/值对的哈希值,并将任何具有相同名称的对象膨胀到一个数组中。这是 Perl(和大多数编程语言)一直以来处理它的常用方式。

    如果您想要 PHP 使用的扩展数据结构格式,那么您将需要使用旨在处理该格式的解析器。

    像往常一样,CPAN to the rescue

    use PHP::ParseStr qw(php_parse_str);
    my $data = php_parse_str($ENV{QUERY_STRING});
    

    【讨论】:

    • 感谢您的回答。我不知道这个模块。我现在不想更改解析器,但也许我将来会使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多