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