有没有一种巧妙的方法将Perl哈希序列化为HTML查询字符串

时间:2011-10-20 16:37:16

标签: html perl serialization

我有一个使用CGI的perl脚本。

浏览器使用一些参数调用它。

我想获取这些参数,修改其中一些参数,然后发回一个带有表示修改参数的新查询字符串的重定向。

我知道我可以这样做,就像这样:

my $cgi = CGI->new()
my %vars = $cgi->Vars
$vars{'modify_me'} .=' more stuff';

my $serialized = join '&', map {$_.'='.$cgi->escapeHTML($vars{$_})} keys %vars;

然而,这只是感觉它可能会丢失一些东西。此外,它没有做任何事情来处理多值参数。谁知道它没有做什么。

那么,是否有一个模块可以解决这个问题?我没有兴趣重新发明一个更有才华的怀疑的车轮。正确?

3 个答案:

答案 0 :(得分:9)

URI module是你的朋友。它有一个query_form方法,它接受参数的hash,hashref或arrayref,并从中生成一个查询字符串。

它将URL为您编码数据(并注意您确实需要URL编码和 HTML编码)。

所以你可能有类似的东西:

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use URI;

my $q = CGI->new;

my @data = map {
        my $name = $_;
        my @values = $q->param($name);
        my $value;
        if (scalar @values == 1) {
            ($value) = @values;
        } else {
            $value = \@values;
        }

        if ($name eq "foo") {
            $value = "replaced";
        }
        ($name, $value);
    } $q->param;

my $uri = URI->new('http://example.com/myAlternative.cgi');
$uri->query_form(\@data);

print $q->redirect(
    -uri=> $uri,
    -status => 301
     );

答案 1 :(得分:2)

您是否看过Data::URIEncodeURI::QueryParam

答案 2 :(得分:2)

事实证明,有一种方法可以仅使用CGI模块来满足我的特定需求。但是,其他答案涵盖了更广泛的需求,以序列化任意哈希。

如果要修改传入参数,然后使用修改后的参数创建指向同一脚本的链接,可以执行以下操作:

my $params = $cgi->Vars;

$ Modify the values in hash that $params references

my $new_url = $cgi->self_url(); # URL with modified parameters