Perl:访问嵌套哈希键的不同方法

时间:2012-09-21 14:56:41

标签: perl hash

我几乎是Perl的新手。所以只是想知道在嵌套哈希中访问值的两种方式之间的差异。

考虑以下哈希:

my %hsh = ( 
    'fruits' => { 
        'red'    => 'apple', 
        'yellow' => 'banana', 
    },
    'veg' => {
        'red'    => 'capcicum',
        'yellow' => 'lemon',
    },
);

#way 1
print $hsh{'fruits'}{'red'}; 

#way 2
print $hsh{'fruits'}->{'red'};

两者都有相同的输出apple。但这两种方式有什么区别?

3 个答案:

答案 0 :(得分:3)

->运算符用于取消引用散列或数组引用。在您的情况下,它不是必需的,因为Perl在处理多维数据结构时会假定取消引用。但在其他情况下,有必要:

my $ref = [ 'a','b','c' ];

print $ref[0];    #Fails
print $ref->[0];  #Succeeds

答案 1 :(得分:1)

没有区别。 Perl的理念是“实现它的方法不止一种”。

->只是一个明确的解除引用。省略它时,Perl 通常知道你的意思。可能存在大型嵌套的情况,您希望明确地拥有它。

编辑我的帖子不清楚。在这种情况下,Perl知道你的意思,但正如@cHao指出的那样,有时它不会。

答案 2 :(得分:0)

->是一个解除引用的运算符;它与hash refs 一起使用,而不是哈希。使用Hashrefs避免创建哈希数据的副本,这会减少CPU和内存的使用。

散列

创建哈希:

my %hash = ('red' => 'apple');

my %hash = %$hashref;

访问使用:

print $hash{'red'};

Hashrefs

创建hashref:

my $hashref = { 'red' => 'apple' };

my $hashref = \%hash;

访问使用:

print $hashref->{'red'};