我有一堆HTML表单字段数据以哈希形式出现,其中每个字段名称都成为密钥&字段值是哈希值...您的标准CGI模块输出来自:
my $query = new CGI;
my %formdata = $query->Vars;
这次我正在处理多个表单字段的集合,每个字段都有一个数字后缀(“name1”“name2”...“size1”“size2”等)。有没有更好的方法来使用计数器循环数组中的那些数组而不是这个?
for (my $i = 1; $i < 10; $i++) {
print " Name $i: " . $formdata{"name$i"} . "\n";
print " Size $i: " . $formdata{"size$i"} . "\n";
}
......这不错,但是有一个更简单的语法吗?即像这样(但这不起作用 - 无法在没有包或对象引用的情况下调用方法“名称”):
print " Name $i: $formdata{name$i}\n";
答案 0 :(得分:6)
明显的解决方案不起作用:
print " Name $i: $formdata{"name$i"}\n";
但可以通过使用"..."
运算符(qq
或qq{...}
或qq(...)
替换任意一组实际双引号qq/.../
来修复任何你喜欢):
print qq{ Name $i: $formdata{"name$i"}\n};
答案 1 :(得分:2)
我通常通过根据表单名称前缀创建键列表来完成此类操作。例如,
my @numbers = sort map { /name(\d+)/ } keys %formdata;
foreach my $num( @numbers ) {
print " Name $num: ", $formdata{ 'name' . $num }, "\n";
...
}
这具有为任意数量的表单元素工作的优点。
答案 2 :(得分:1)
如果您想在"
分隔的字符串中使用"
,请将其转义。
print " Name $i: $formdata{\"name$i\"}\n";
或更改分隔符。
print qq{ Name $i: $formdata{"name$i"}\n};
或者避免使用"
。
print " Name $i: $formdata{qq{name$i}}\n";
print " Name $i: $formdata{'name'.$i}\n";
printf " Name %s: %s\n", $i, $formdata{"name$i"};
print " Name $i: " . $formdata{"name$i"} . "\n";