在Perl哈希键名称中使用计数器变量
我有一堆HTML表单字段数据作为散列输入,其中每个字段名都成为键&字段值就是散列值。。。您的标准CGI模块输出来自:在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
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在他的回答中得到了这一点&在你的回答之前一个小时的后续评论,但除此之外,我认为你的回答也绝对正确&我感谢所有的例子。祝你过得愉快