在Perl哈希键名中使用计数器变量

时间:2012-02-29 18:48:52

标签: perl variables hash

我有一堆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";

3 个答案:

答案 0 :(得分:6)

明显的解决方案不起作用:

  print "  Name $i: $formdata{"name$i"}\n";

但可以通过使用"..."运算符(qqqq{...}qq(...)替换任意一组实际双引号qq/.../来修复任何你喜欢):

  print qq{  Name $i: $formdata{"name$i"}\n};

请参阅"Quote and Quote-like Operators" in the perlop man-page

答案 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";