我正在尝试创建一个哈希数组,但是在遍历数组时遇到了麻烦。我试过这段代码,但它不起作用:
for ($i = 0; $i<@pattern; $i++){
while(($k, $v)= each $pattern[$i]){
debug(" $k: $v");
}
}
我正在尝试创建一个哈希数组,但是在遍历数组时遇到了麻烦。我试过这段代码,但它不起作用:
for ($i = 0; $i<@pattern; $i++){
while(($k, $v)= each $pattern[$i]){
debug(" $k: $v");
}
}
首先,你为什么不use
ingstrict
和warnings
?以下几行应该在您创建的每个 Perl 程序的顶部,紧跟在#!/usr/bin/perl
. 总是。
use strict;
use warnings;
而且我知道你不是,因为我很确定你会从中得到一些很好的错误消息,strict
以及warnings
从你的代码中的许多其他地方,从你的变量使用来看。
其次,你为什么不这样做:
for my $i (@pattern) {
..
}
循环遍历 中的每个元素@pattern
,一次将它们分配给$i
一个。然后,在你的循环中,当你想要一个特定的元素时,只需使用$i
. 对 的更改$i
将反映在 中@pattern
,当循环退出时,$i
将超出范围,本质上是自行清理。
第三,看在 Larry Wall 的份上,请声明你的变量my
来本地化它们。我保证,这真的没那么难,它会让你成为一个更好的人。
第四,也是最后,您的数组存储对哈希的引用,而不是哈希。如果他们存储散列,您的代码将是错误的,因为散列以 开头%
,而不是$
。事实上,(任何类型的)引用都是标量值,因此以$
. 所以我们需要取消引用它们来获取哈希值:
for my $i (@pattern) {
while(my($k, $v) = each %{$i}) {
debug(" $k: $v");
}
}
或者,你的方式:
for (my $i = 0; $i<@pattern; $i++) { # added a my() for good measure
while(my($k, $v) = each %{$pattern[$i]}) {
debug(" $k: $v");
}
}
试试这个:
for my $hashref (@pattern) {
for my $key (keys %$hashref) {
debug "$key: $hashref->{$key}";
}
}
您尝试的最大问题是each $pattern[$i]
. each函数期望一个散列起作用,但$pattern[$i]
返回一个 hashref(即对散列的引用)。您可以通过取消引用$pattern[$i]
作为哈希来修复您的代码:
while(my($k, $v) = each %{$pattern[$i]}) {
此外,请注意每个函数,它可能会使哈希迭代器处于不完整状态。
请参阅 perl 数据结构说明书的文档:
perldoc perldsc