2011-12-29 98 views
0

任何人都可以通過替換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

回答

5
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

5
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

0

是的。但是,這可能不是你想要的東西:

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

4不在%哈希原來的值:

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