散列元素的编程访问
问题描述:
任何人都可以通过替换PFM块使此打印“4”?散列元素的编程访问
my %hash;
$hash{1}{2}{3}=4;
my @key=qw(1 2 3);
my $key;
for(@key){PFM}
print $hash{$key}
答
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 '[]'
号因为$关键的时候有民主基金的价值,你得到的打印声明。 – tadmc 2011-12-29 17:50:33
不可以,因为您不是试图从%hash获取值。 (@tadmc所说的没有任何意义,PFM可以将'$ key'设置为undef以外的内容。) – ikegami 2011-12-29 18:04:08
如何删除对SO的评论? – tadmc 2011-12-30 02:57:04