在Perl中打印哈希对

3
请问这两种哈希初始化方法有什么区别? 第一种方法:
$items{"food"} = "4.4";
$items{"water"} = "5.0";
$items{"shelter"} = "1.1";

foreach $item (keys $items) {
    print "$item\n";
}

输出结果为:

food
water
shelter
第二种方法:
%items = { 
    'food' => '4.4', 
    'water' => '5.0', 
    'shelter' => '1.1' 
};

foreach $item (keys %items) {
    print "$item\n";
}

输出结果是一个哈希引用:

HASH(0x8cc41bc)

为什么第二种方法返回引用而不是实际值?

1
在第二种情况下,您将匿名哈希的单个引用分配给了%hash。因此,只有一个键:哈希引用的字符串表示形式和相应的undef值。投票关闭。 - Sinan Ünür
3
你需要指定一组键值对,可以使用 my %h = ( ... ) 的形式,或者将其分配给一个标量,即 my $h = { ... }。如果你选择后者,使用 keys %$h - Sinan Ünür
@SinanÜnür 嗯,这不仅仅是一个拼写错误,而是一个错误的符号,这是一种不同类型的错误。 - PerlDuck
2
@SinanÜnür %hash = { } 不是打字错误,这是一个非常普遍的误解。(我昨天刚向某人指出了同样的问题。)虽然它不完全是重复的,但最好将 OP 指向 为什么有些哈希使用花括号初始化,而有些使用圆括号?,而不是关闭为打字错误。 - ThisSuitIsBlackNot
@zdim 搜索花括号或圆括号等特殊字符并不容易,而 Perl 中充满了这些字符。Google(据我所知)会过滤它们。我有时会使用 SymbolHound - PerlDuck
显示剩余4条评论
2个回答

8

因为您误解了{}的功能。

它创建一个匿名哈希表,并返回一个引用。

您刚才所做的与以下代码在功能上类似:

my %stuff = (
   'food' => '4.4', 
    'water' => '5.0', 
    'shelter' => '1.1' 
);


my %items = \%stuff;

这并不是很合理。

使用()来初始化哈希表,它会正常工作。


2

这是一个很好的例子,说明为什么在Perl代码中始终打开警告是必要的。

$ perl -Mwarnings -E'%h = {}; say keys %h'
Reference found where even-sized list expected at -e line 1.
HASH(0xbb6d48)

如果需要更详细的解释,请使用“诊断”功能。

$ perl -Mwarnings -Mdiagnostics -E'%h = {}; say keys %h'
Reference found where even-sized list expected at -e line 1 (#1)
    (W misc) You gave a single reference where Perl was expecting a list
    with an even number of elements (for assignment to a hash). This usually
    means that you used the anon hash constructor when you meant to use
    parens. In any case, a hash requires key/value pairs.

        %hash = { one => 1, two => 2, };        # WRONG
        %hash = [ qw/ an anon array / ];        # WRONG
        %hash = ( one => 1, two => 2, );        # right
        %hash = qw( one 1 two 2 );              # also fine

HASH(0x253ad48)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接