如何使用foreach解析许多哈希?

时间:2013-07-20 10:00:49

标签: perl

foreach my %hash (%myhash1,%myhash2,%myhash3)
{
   while (($keys,$$value) = each %hash)
   {
      #use key and value...
   }
}

为什么这不起作用:

它说foreach行的语法错误。 请告诉我为什么这是错误的。

2 个答案:

答案 0 :(得分:4)

这是错误的,因为您似乎认为这允许您将每个哈希作为单独的构造进行访问,而您实际上正在做的是除了语法错误之外,还将哈希作为混合新列表进行访问。例如:

my %hash1 = qw(foo 1 bar 1);
my %hash2 = qw(abc 1 def 1);

for (%hash1, %hash2)  # this list is now qw(foo 1 bar 1 abc 1 def 1)

在列表上下文语句中放置哈希(或数组)时,它们将扩展为其元素,并且不保留其完整性。一些内置函数确实允许这种行为,但普通的Perl代码不允许这样做。

您也不能将散列指定为for迭代器变量,它只能是标量值。你能做的是:

for my $hash (\%myhash1, \%myhash2, \%myhash3) {
    while (my ($key, $value) = each %$hash) {
        ...

也就是说,您创建一个哈希引用列表并迭代它们。请注意,您无法通过此方法区分哈希值。

另请注意,我使用my $hash因为此变量必须是标量。

答案 1 :(得分:1)

语法应该是:

my $hash1 = {'a'=>1};
my $hash2 = {'b'=>1};

my @arr2 = ($hash1, $hash2);

foreach $hash (@arr2)
{
                while(($key, $value) = each %$hash)
                {
                                print $key, $value;
                }
}

您需要引用然后取消引用哈希。