2011-12-29 11 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

番号$キーを使用すると、印刷に着くまでにはundefの値を持っているのでステートメント。 – tadmc

+0

いいえ。%hashから値を取得しようとしていないためです。 (@tadmcが言ったことは意味がありません.PPMは '$ key'をundef以外のものに設定することができます) – ikegami

+0

SOのコメントをどうやって削除しますか? – tadmc

答えて

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

my @key=qw(1 2 3); 

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

print $data 
+0

それは私が行方不明だった!私の$データ= \%ハッシュ;全部の鍵だった。優れた仕事! – Hawk

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

か、キーのいずれかの部分が存在しない場合はどちらのバージョンが何かをvivifyます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 \$_,は、データを作るために必要とされて:あなたは、このようなキーを使用して値を設定したい場合は


::ダイバーはarraの代わりにハッシュを作るys)。

+0

これは非常に興味深く便利です。私もこれを投票しました。ありがとう! – Hawk

0

はい。しかし、それはあなたが何を望むか、おそらくではありません。

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

4はもともと%のハッシュの値ではありません。

my @fours = grep $_ == 4, values %hash; 
print "[@fours]\n"; # prints '[]' 
関連する問題