如何在Perl中创建哈希数组并在其中循环?

时间:2009-08-24 07:20:53

标签: arrays perl hash perl-data-structures

我正在尝试创建一个哈希数组,但是我无法在数组中循环。我试过这段代码,但它不起作用:

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

3 个答案:

答案 0 :(得分:24)

首先,为什么不use strictwarnings?在#!/usr/bin/perl之后,以下行应位于您创建的每个Perl程序的顶部。 始终

use strict;
use warnings;

而且我知道你不是因为我非常确定你会从strictwarnings以及代码中的许多其他地方收到一些不错的错误消息,根据你的变量使用判断。

其次,你为什么不这样做:

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");
  }
}

答案 1 :(得分: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]}) {

另外,要注意每个功能,它可以leave the hash iterator in an incomplete state

答案 2 :(得分:4)

请参阅perl数据结构cookbook的文档: perldoc perldsc