如何grep perl Hash Keys进入数组?

时间:2009-12-07 07:54:40

标签: perl

我是一名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插入数组的方式吗?

2 个答案:

答案 0 :(得分:6)

它没有归还Apple。它评估一个散列片,该散列片由与@fruits中的键对应的散列中的所有值组成。请注意,如果您打开警告,则会收到2条未初始化值的警告。这是因为myFavourite不包含键OrangeGrape的值。在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。