我正在使用Perl CGI模块。如果我有像这样的HTML
<select multiple name="FILTER_SITE">
<option>1</option>
<option>2</option>
</select>
并提交我的表单我可以在URL中获得这样的内容:
[..] FILTER_SITE=1&FILTER_SITE=2
Perl的my $FILTER_SITE = $cgi->param('FILTER_SITE');
只捕获第一个实例。
如何使用两者(在这种情况下)?劈开它并自己解析引用程序并将它们添加到数组是我的第一个想法,但它有点乱,然后我再也不熟悉CGI.pm或Perl。
有趣地使用Data :: Dumper
print "<pre>".Dumper($cgi->param('FILTER_SITE')) . "</pre>";
$VAR1 = '1';
$VAR2 = '2';
答案 0 :(得分:7)
param
方法在标量上下文中提供单个值,并且(可能)在列表上下文中提供多个值。阅读它here。
因此,如果您将代码更改为,例如
my @FILTER_SITE = $cgi->param('FILTER_SITE');
然后数组将包含选项的所有选定值。
如果它更适合您的代码,您也可以写
for my $FILTER_SITE ($cgi->param('FILTER_SITE')) {
:
}
答案 1 :(得分:2)
我知道这是一篇过时的文章,但是自从回答了这个问题以来,似乎没有什么改变。我想发布有关此问题的最新信息,特别是因为现在已将接受的答案视为安全漏洞。 CGI.pm documentation says
{{Warning - calling param() in list context can lead to vulnerabilities if you do not sanitise user input as it is possible to inject other param keys and values into your code. This is why the multi_param() method exists, to make it clear that a list is being returned, note that param() can still be called in list context and will return a list for back compatibility.
}
建议改用$cgi->multi_param
方法。
答案 2 :(得分:0)
解析值的示例
#!/usr/bin/perl
use Encode;
print "Content-Type: text/html; charset=UTF-8\n\n";
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $querystring, $ENV{'CONTENT_LENGTH'});
print "<h1>POST</h1>";
} else {
print "<h1>GET</h1>";
$type = "display_form";
$querystring = $ENV{'QUERY_STRING'};
}
print "<p>$querystring</p>";
if (length ($querystring) > 0){
@pairs = split(/&/, $querystring);
foreach $pair (@pairs){
($name, $value) = split(/=/, $pair);
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
if (exists $in{$name}) {
$value = "$value,$in{$name}";
}
$in{$name} = $value;
}
}
foreach my $val (sort keys %in) {
print "<p>$val: $in{$val}</p>";
}