我有一个使用CGI的perl脚本。
浏览器使用一些参数调用它。
我想获取这些参数,修改其中一些参数,然后发回一个带有表示修改参数的新查询字符串的重定向。
我知道我可以这样做,就像这样:
my $cgi = CGI->new()
my %vars = $cgi->Vars
$vars{'modify_me'} .=' more stuff';
my $serialized = join '&', map {$_.'='.$cgi->escapeHTML($vars{$_})} keys %vars;
然而,这只是感觉它可能会丢失一些东西。此外,它没有做任何事情来处理多值参数。谁知道它没有做什么。
那么,是否有一个模块可以解决这个问题?我没有兴趣重新发明一个更有才华的怀疑的车轮。正确?
答案 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)
答案 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