Perl - 为什么按其键循环散列然后打印每个值会导致未初始化的警告?

标签 perl hash foreach

每当我通过它的键循环哈希,然后打印每个值时,我都会收到“在连接 (.) 或字符串中使用未初始化的值...”警告。即使散列已明确初始化。我想要的输出被打印出来,但我仍然想知道为什么这会导致警告,尤其是直接访问一个值(在循环外)没有警告的情况下。

#!/usr/bin/perl
use warnings;
use strict;

my %fruit = ();
%fruit = ('Apple' => 'Green', 'Strawberry' => 'Red', 'Mango' => 'Yellow');

#works
print  "An apple is $fruit{Apple} \n";

#gives warnings
foreach my $key (%fruit)
{
  print "The color of $key is $fruit{$key} \n";
}

#also gives warnings
foreach my $key (%fruit)
{
    my $value = $fruit{$key};
    print "$value \n";
}

考虑上面的代码。我猜 perl 看到了第一次打印和第二次打印之间的差异。但为什么?为什么在循环外检索哈希值与在循环内检索 has 值之间存在差异?

谢谢!

最佳答案

在列表上下文中使用散列会产生键和值。因此行 foreach my $key (%fruit)迭代键、值、键、值...

您需要的是foreach my $key (keys %fruit) .

关于Perl - 为什么按其键循环散列然后打印每个值会导致未初始化的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14275084/

相关文章:

perl - 向数组散列添加新值的简写

perl - 有没有办法通过我的 Perl 程序中的命令行开关启用/禁用 Smart::Comments?

java - 覆盖父类(super class)的 equals 和 hashcode 方法。我是否为子类做

perl - 如何将 boolean 条件结果分配给 perl 中的标量变量?

arrays - $#vvv--; 是什么意思?在 Perl 中对哈希做什么?

foreach 生成的 php fatal error "Cannot access empty property"

apache-spark - spark 2.2 struct Streaming foreach writer jdbc sink 滞后

javascript - Angular.forEach 只返回一个结果?

linux - app->start之后怎么办;在 Perl 的 Mojolicious websocket 中

perl - 脚本崩溃后,如何避免在 Perl 中使用 ophan 监听套接字?