URL中的嵌套哈希参数 - CGI

时间:2016-09-09 12:51:23

标签: perl cgi

如何将嵌套的哈希参数传递给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'
}

感谢任何提示。

注意:好的,我可以解析字符串&#39;数据[yxz]&#39;并将整个对转换为hashref,但我想知道是否有任何&#39; native&#39;这个功能。

2 个答案:

答案 0 :(得分:2)

否。

没有原生方式来做到这一点。如果您使用的是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数据结构。

答案 1 :(得分:0)

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

大多数解析器会为您提供键/值对的散列,并将具有相同名称的任何一个扩散到数组中。这是Perl(和大多数编程语言)几乎永远处理它的常见方式。

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

像往常一样CPAN to the rescue

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