访问perl中的哈希引用

时间:2011-05-31 21:38:27

标签: perl perl-data-structures

我想知道在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','b','c','d','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中的元素构建一个哈希引用层次结构,并且可能使用一个循环,就像我在示例代码中尝试的那样。

谢谢! -Abhi

2 个答案:

答案 0 :(得分:2)

# '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, @array1);
build_hash($hash, @array2);

另请参阅:Data::Diver

答案 1 :(得分:0)

这应该与你认为应该有效一样。作为旁注,有时当你有哈希哈希的哈希值时,你首先想要的是一个带有复合键的哈希,比如$ h {“$ a,$ b,$ c”}而不是$ h {$ a} {$ b} {$ c}。请记住一些事情。我不知道它是否适用于此。