4

我正在尝试创建一个哈希数组,但是在遍历数组时遇到了麻烦。我试过这段代码,但它不起作用:

for  ($i = 0; $i<@pattern; $i++){
  while(($k, $v)= each $pattern[$i]){
    debug(" $k: $v");
  }
}
4

3 回答 3

24

首先,你为什么不useingstrictwarnings?以下几行应该在您创建的每个 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");
  }
}
于 2009-08-24T07:29:35.230 回答
6

试试这个:

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]}) {

此外,请注意每个函数,它可能会使哈希迭代器处于不完整状态

于 2009-08-24T07:29:24.213 回答
4

请参阅 perl 数据结构说明书的文档: perldoc perldsc

于 2009-08-24T10:15:10.713 回答