Perl 如何使用foreach解析许多散列?

Perl 如何使用foreach解析许多散列?,perl,Perl,为什么这不起作用: 它说foreach行上有synta错误。 请告诉我为什么它是错误的。这是错误的,因为您似乎认为这允许您将每个哈希作为一个单独的构造来访问,而事实上,除了语法错误之外,您所做的是将哈希作为一个混合在一起的新列表来访问。例如: foreach my %hash (%myhash1,%myhash2,%myhash3) { while (($keys,$$value) = each %hash) { #use key and value... } }

为什么这不起作用:

它说foreach行上有synta错误。
请告诉我为什么它是错误的。

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

foreach my %hash (%myhash1,%myhash2,%myhash3)
{
   while (($keys,$$value) = each %hash)
   {
      #use key and value...
   }
}
当您在列表上下文语句中放置哈希(或数组)时,它们将被扩展到其元素中,并且不会保留其完整性。一些内置函数确实允许这种行为,但普通的Perl代码不允许

您也不能将哈希指定为迭代器变量的
,该变量只能是标量值。你能做的是:

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)
也就是说,您创建了一个哈希引用列表并对其进行迭代。请注意,使用这种方法无法区分散列之间的差异


还要注意,我使用了
my$hash
,因为这个变量必须是标量

语法应该如下所示:

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

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

谢谢。谢谢。我现在已经理解了散列的整个概念。您认为需要使用散列引用是正确的。但是,不需要从匿名散列引用开始(
$hash={}
)。您只需要创建对hash
$hash\u ref=\%hash
my $hash1 = {'a'=>1};
my $hash2 = {'b'=>1};

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

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