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

为什么这不起作用:

它在 foreach 行上显示语法错误。请告诉我为什么错了。

4

2 回答 2

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此变量是因为此变量必须是标量。

于 2013-07-20T10:10:42.603 回答
1

语法应该是这样的:

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

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

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

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

于 2013-07-20T10:22:33.587 回答