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

在Perl哈希键名称中使用计数器变量,perl,variables,hash,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

我有一堆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";
但是可以通过使用
qq
操作符(
qq{…}
qq(…)
qq/../
或您喜欢的任何东西)替换实际双引号集
“…”
)来修复:


请参阅。

显而易见的解决方案不起作用:

  print "  Name $i: $formdata{"name$i"}\n";
但是可以通过使用
qq
操作符(
qq{…}
qq(…)
qq/../
或您喜欢的任何东西)替换实际双引号集
“…”
)来修复:


请参阅。

我通常通过根据表单名称前缀创建一个键列表来完成这类工作。比如说,

my @numbers = sort map { /name(\d+)/ } keys %formdata;
foreach my $num( @numbers ) { 
    print "  Name $num: ", $formdata{ 'name' . $num }, "\n";
    ...
}

这样做的优点是可以处理任意数量的表单元素

我通常通过根据表单名称前缀制作一个键列表来完成这类工作。比如说,

my @numbers = sort map { /name(\d+)/ } keys %formdata;
foreach my $num( @numbers ) { 
    print "  Name $num: ", $formdata{ 'name' . $num }, "\n";
    ...
}
这样做的优点是可以处理任意数量的表单元素

如果要在由
分隔的字符串中使用
,请将其转义

print "  Name $i: $formdata{\"name$i\"}\n";
或更改分隔符

print qq{  Name $i: $formdata{"name$i"}\n};
或者避免使用

如果要在由
分隔的字符串中使用
,请将其转义

print "  Name $i: $formdata{\"name$i\"}\n";
或更改分隔符

print qq{  Name $i: $formdata{"name$i"}\n};
或者避免使用


排序
默认情况下,使用算术字符串比较。您的意思必须是
排序{$a$b}映射…
,而不是简单地
排序映射…
。另外,我认为您应该将正则表达式锚定到字符串开始和字符串结束,方法是编写
/^name(\d+)\z/
而不是
/name(\d+)/
。Neat似乎是获取最大字段的一个好方法。这无疑是对脚本中循环max的硬编码的改进,以防表单发生变化&也有人忘记更新脚本。不完全是我想要的,但也很酷!感谢
排序
,默认情况下,使用算术字符串比较。您的意思必须是
排序{$a$b}映射…
,而不是简单地
排序映射…
。另外,我认为您应该将正则表达式锚定到字符串开始和字符串结束,方法是编写
/^name(\d+)\z/
而不是
/name(\d+)/
。Neat似乎是获取最大字段的一个好方法。这无疑是对脚本中循环max的硬编码的改进,以防表单发生变化&也有人忘记更新脚本。不完全是我想要的,但也很酷!谢谢谢谢,我不确定是否还有其他方法,因为打印“name$I$formdata{$varname}”;当整个键名被做成一个字符串变量时,如果没有双内插,似乎可以工作…@Wick:我想你误解了
“$formdata{$varname}”
的工作原理。它实际上不插入
$varname
;它只需要将
$varname
作为一个普通的字符串表达式,并使用该表达式的值作为键。注意,您甚至可以在双引号之外编写
$formdata{$varname}
;相反,您甚至可以在双引号内编写类似于
$formdata{'name'.$i}
的内容。这有意义吗?所以
qq{$formdata{“name$i”}
没有做“双插值”;它将
$i
精确地插入一次,并将例如
$formdata{'name6'}
精确地插入一次。啊哈,谢谢,这解释了很多&非常清楚。我真的很感激!谢谢,自从打印“name$I$formdata{$varname}”之后,我不确定是否还有其他方法;当整个键名被做成一个字符串变量时,如果没有双内插,似乎可以工作…@Wick:我想你误解了
“$formdata{$varname}”
的工作原理。它实际上不插入
$varname
;它只需要将
$varname
作为一个普通的字符串表达式,并使用该表达式的值作为键。注意,您甚至可以在双引号之外编写
$formdata{$varname}
;相反,您甚至可以在双引号内编写类似于
$formdata{'name'.$i}
的内容。这有意义吗?所以
qq{$formdata{“name$i”}
没有做“双插值”;它将
$i
精确地插入一次,并将例如
$formdata{'name6'}
精确地插入一次。啊哈,谢谢,这解释了很多&非常清楚。我真的很感激!太棒了,谢谢你。ruakh在他的回答中得到了这一点&在你的回答之前一个小时的后续评论,但除此之外,我认为你的回答也绝对正确&我感谢所有的例子。祝你过得愉快,太棒了,谢谢。ruakh在他的回答中得到了这一点&在你的回答之前一个小时的后续评论,但除此之外,我认为你的回答也绝对正确&我感谢所有的例子。祝你过得愉快