切片Perl中的嵌套哈希(Slicing a nested hash in Perl)

2019-09-22 12:33发布

说我有一个哈希值,我可以索引:

$hash{$document}{$word}

从我读在线(虽然我无法找到这对perlreftut , perldsc或perllol ),我可以用一个列表,如果我用切片的哈希@前缀我的哈希以表明我想哈希返回一个列表。 但是,如果我尝试使用列表切开我的哈希@list

@%hash{$document}{@list}

我得到几个"Scalar values ... better written"错误。

我怎样才能削减Perl中的嵌套哈希?

Answer 1:

您哈希的SIGILL必须是@ ,就像这样:

@{$hash{$document}}{@list}

假设@list包含有效的密钥%hash将返回相应的值,或undef ,如果该键不存在。

这是基于散列切片的一般规律:

%foo = ( a => 1, b => 2, c => 3 );
print @foo{'a','b'};               # prints 12
%bar = ( foo => \%foo );           # foo is now a reference in %bar
print @{ $bar{foo} }{'a','b'};     # prints 12, same data as before


Answer 2:

首先,当你希望得到一个哈希片列表,请使用@第一印记。 %是没有意义在这里。

其次,你应该明白, $hash{$document}值不是一个哈希或数组。 这是一个参考 - 一个哈希或数组。

有了这一切说,你可能会使用这样的:

@{ $hash{$document} }{ @list };

...所以你提领的价值$hash{$document} ,然后使用散列切片过去。 例如:

my %hash = (
    'one' => {
        'first'  => 1,
        'second' => 2,
     },
     'two' => {
        'third'  => 3,
        'fourth' => 4,
     } 
);

my $key  = 'one';
my @list = ('first', 'second');

print $_, "\n" for @{ $hash{$key} }{@list};
# ...gives 1\n2\n


文章来源: Slicing a nested hash in Perl
标签: perl hash slice