在perl中访问哈希引用

问题描述

| 我想知道是否可以在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}。只是要记住一点。我不知道这里是否适用。