2009-12-07 50 views
3

Iam perl新手,需要帮助理解下面的一段代码。如何grep Perl的哈希键入数组?

我有这样

1 my %myFavourite = ("Apple"=>"Apple"); 
2 my @fruits = ("Apple", "Orange", "Grape"); 
3 @myFavourite{@fruits}; # This returns Apple. But how? 

定义一个Perl哈希这将是巨大的,如果Perl高手能解释这是怎么回事在线路3上面的代码。 myFavourite被声明有一个散列,但用作数组?这个语句简单地使用哈希键,将其输入到数组中,并返回与搜索到的键相对应的哈希值。这是我们grep散列键入数组的方式吗?

+0

感谢William和Zen。 – rajachan 2009-12-07 09:04:20

+0

有助于理解这一点的一件事是理解Perl变量中sigil变化背后的逻辑。哈希由'%'定义,如%myhash =(a => 1,b => 2),但当您返回hash的一个元素(标量)时,您将标记更改为标量:$ myhash {a} 。但是如果你想返回几个元素(一个数组),你可以相应地改变它的标签:@myhash {a,b}。如果您有@myWantedKeys =('a','b')的数组,那么您可以使用@myhash {@myWantedKeys}检索这些键的值。 – 2011-10-29 10:31:26

回答

6

它不返回Apple。它的计算结果为散列片,其中包含与@fruits中的键相对应的散列值中的所有值。注意如果你打开警告,你会得到2个有关未初始化值的警告。这是因为myFavourite不包含密钥OrangeGrape的值。在perldata中查找'hash slice'。

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

+2

perldata页面在这里:http://perldoc.perl.org/perldata.html – 2009-12-07 08:43:07

5

myFavourite声明有散列,但用作数组?

是的,它返回一个列表。这是一个散列片。参见:http://perldoc.perl.org/perldata.html

把它想象成数组@fruits扩展为多个散列键查找。 @hash {@keys}语法仅仅是一种提取散列部分的方便方法。

具体来说:

@myFavourite{@fruits} 

相当于:

($myFavourite{'Apple'},$myFavourite{'Orange'},$myFavourite{'Grape'}) 

如果被叫在列表环境或在标量上下文中的所有三个元件的串联(例如打印),它返回一个三个项目列表

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; 

,你会看到两个未初始化值口译员的警告被autovivified作为民主基金。