哈希元素的编程访问

时间:2011-12-29 17:38:57

标签: perl hash

任何人都可以通过更换PFM块来打印“4”吗?

my %hash;
$hash{1}{2}{3}=4;

my @key=qw(1 2 3);

my $key;

for(@key){PFM}

print $hash{$key}

3 个答案:

答案 0 :(得分:5)

my %hash;
$hash{1}{2}{3}=4;

my @key=qw(1 2 3);

my $data = \%hash;
for(@key){
  $data = $data->{$_}
}

print $data

答案 1 :(得分:5)

my $val = \%hash;
$val //= $val->{$_} for @key;
say $val;

或者您可以使用Data::Diver

use Data::Diver qw( Dive );
say Dive(\%hash, @key);

如果密钥的任何部分不存在,任何一个版本都不会生存任何内容。


如果要使用这样的键设置值:

my $p = \\%hash;
$p = \( $$p->{$_} ) for @key;
$$p = 5;

use Data::Diver qw( DiveRef );
my $ref = DiveRef(\%hash, map \$_, @key);
$$ref = 5;

use Data::Diver qw( DiveVal );
DiveVal(\%hash, map \$_, @key) = 5;

(需要map \$_,才能使Data :: Diver为数字键设置哈希值而不是数组。)

答案 2 :(得分:0)

是。但它可能不是你想要的:

$key = "X";
$hash{X} = 4;

4最初不是%hash的值:

my @fours = grep $_ == 4, values %hash;
print "[@fours]\n"; # prints '[]'