散列元素的编程访问

问题描述:

任何人都可以通过替换PFM块使此打印“4”?散列元素的编程访问

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

my @key=qw(1 2 3); 

my $key; 

for(@key){PFM} 

print $hash{$key} 
+1

号因为$关键的时候有民主基金的价值,你得到的打印声明。 – tadmc 2011-12-29 17:50:33

+0

不可以,因为您不是试图从%hash获取值。 (@tadmc所说的没有任何意义,PFM可以将'$ key'设置为undef以外的内容。) – ikegami 2011-12-29 18:04:08

+0

如何删除对SO的评论? – tadmc 2011-12-30 02:57:04

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

my @key=qw(1 2 3); 

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

print $data 
+0

这就是我错过的!我的$ data = \%散列;是整个事情的关键。优秀作品! – Hawk 2011-12-29 18:00:39

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

或者你可以使用Data::Diver

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

如果键的任何部分不存在,无论是版本将vivify什么。


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

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 \$_,需要使数据::潜水员做哈希而不是阵列ys为数字键)

+0

这非常有趣和有用。我也投了赞成票。谢谢! – Hawk 2011-12-29 18:15:05

是的。但是,这可能不是你想要的东西:

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

4不在%哈希原来的值:

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