我是一名perl新手,在理解下面的代码时需要帮助。
我有像这样定义的perl Hash
1 my %myFavourite = ("Apple"=>"Apple");
2 my @fruits = ("Apple", "Orange", "Grape");
3 @myFavourite{@fruits}; # This returns Apple. But how?
如果perl大师可以解释上面代码的第3行中发生了什么,那将是很好的。 myFavourite声明有一个哈希,但用作数组?该语句只需获取哈希的密钥,将其压入数组并返回与搜索的密钥对应的哈希值。这是我们将Hash Keys插入数组的方式吗?
答案 0 :(得分:6)
它没有归还Apple。它评估一个散列片,该散列片由与@fruits
中的键对应的散列中的所有值组成。请注意,如果您打开警告,则会收到2条未初始化值的警告。这是因为myFavourite
不包含键Orange
和Grape
的值。在perldata中查找'hash slice'。
基本上,@myFavourite{@fruits}
是($myFavourite{Apple}, $myFavourite{Orange}, $myFavourite{Grape})
的简写,在本例中为($myFavourite{Apple},undef,undef)
。如果您打印它,您看到的唯一输出是Apple
。
答案 1 :(得分:5)
myFavourite声明有一个哈希,但用作数组?
是的,它会返回一个列表。这是一个哈希切片。请参阅:http://perldoc.perl.org/perldata.html
将其视为数组@fruits扩展为多个哈希键查找。 @hash {@keys}语法只是提取部分哈希的一种方便方法。
具体做法是:
@myFavourite{@fruits}
相当于:
($myFavourite{'Apple'},$myFavourite{'Orange'},$myFavourite{'Grape'})
如果在列表上下文中调用,则返回三项列表,或者在标量上下文中返回所有三个元素的串联(例如print)
my @slice_values = @myFavourite{@fruits}
# @slice_values now contains ('Apple',undef,undef)
# which is functionally equivalent to:
my @slice_values = map { $myFavourite{$_} } @fruits;
如果您只想使用键提取哈希值,请执行以下操作:
my @favourite_fruits = @myFavourite{ grep { exists $myFavourite{$_} } @fruits };
# @favourite_fruits now contains ('Apple')
如果你:
use warnings;
你会看到口译员警告两个未初始化的值被自动归类为undef。