问题描述
|
我想知道是否可以在perl中执行以下操作。它将保存40-50行代码。
我有一个哈希数据结构,如下所示:
hash_Ref->{a}->{b}->{c}->{d}->{e}->{\'count\'}=30
我想知道是否有一种方法可以做到以下几点:
my $hash_ref_1 = ash_Ref->{a}->{b}->{c}->{d};
然后使用:
$hash_ref_2->{e}.
因此,总之,我想将哈希引用存储到变量中层次结构中的点“ x”之前,然后访问点“ x”指向的引用。我认为在上面的示例中这更加清楚。
更多细节
我尝试了几件事,但似乎并不适合我。我正在复制代码,但不是我尝试复制哈希的所有内容。另外我得到的输出是这样的
$VAR1 = {
\'e\' => {
\'count\' => 2
},\'c\' => {
\'count\' => 2
},\'a\' => {
\'count\' => 2
},\'b\' => {
\'count\' => 2
},\'d\' => {
\'count\' => 2
}
};
我期望这样的地方:
\'a\' => { \'count\' => 2,\'b\' => { \'count\' => 2,\'c\' => ......} }
这是我使用的一些代码:
use strict;
use Data::Dumper;
my @array1 = (\'a\',\'b\',\'c\',\'d\',\'e\');
my @array2 = (\'a\',\'e\');
my $hash;
build_hash(\\@array1);
build_hash(\\@array2);
sub build_hash {
my @array = @{shift @_};
my $hash_ref;
for ( my $i =0 ; $i < scalar @array ; $i++ ){
print \"$i \\t $array[$i] \\n\";
if ( exists $hash->{$array[$i]} ){
$hash->{$array[$i]}->{\'count\'}++;
}
else{
$hash->{$array[$i]}->{\'count\'}=1;
}
}
print Dumper($hash);
}
我想基于perl中的元素按顺序构建哈希引用的层次结构,并且可能像我在示例代码中尝试的那样使用一个循环。
谢谢!
-阿比
解决方法
# \'a\' => { \'count\' => 2,\'b\' => { \'count\' => 2,\'c\' => ......} }
sub build_hash {
$_[0] ||= {};
my $hash = shift;
for (@_) {
$hash = $hash->{$_} ||= {};
++$hash->{count};
}
}
build_hash($hash,@array1);
build_hash($hash,@array2);
如果要使用自动生存,可以将其编写如下:
sub build_hash {
my $p = \\shift;
for (@_) {
$p = \\( $$p->{$_} );
++$$p->{count};
}
}
build_hash($hash,@array2);
另请参阅:Data :: Diver
, 这应该非常有效,就像您认为应该起作用一样。附带说明一下,有时候,当您拥有hash of hash of ...的时候,您真正想要的是一个带有compund键的哈希,例如$ h {\“ $ a,$ b,$ c \” },而不是$ h {$ a} {$ b} {$ c}。只是要记住一点。我不知道这里是否适用。