如何grep perl Hash Keys进入一个数组?

raj*_*han 3 perl

我是一个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插入阵列的方式吗?

Wil*_*ell 6

它没有归还Apple.它评估一个散列片,该散列片由与其中的键对应的散列中的所有值组成@fruits.请注意,如果您打开警告,则会收到2条未初始化值的警告.这是因为myFavourite不包含键Orange和值的值Grape.在perldata中查找'hash slice'.

基本上,@myFavourite{@fruits}是简写($myFavourite{Apple}, $myFavourite{Orange}, $myFavourite{Grape}),在这种情况下是($myFavourite{Apple},undef,undef).如果你打印它,你看到的唯一输出是Apple.


zen*_*zen 5

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.