Доступ к хеш-ссылке в Perl - PullRequest
0 голосов
/ 01 июня 2011

Мне интересно, можно ли сделать следующее в 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 ]

2 голосов
/ 01 июня 2011
# '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

0 голосов
/ 01 июня 2011

Это должно работать так же, как вы думаете, это должно работать. В качестве примечания, иногда, когда у вас есть хеш хэша хэша ... то, что вам действительно нужно, во-первых, это один хеш с ключом компандирования, например, $ h {"$ a, $ b, $ c"} $ h {$ a} {$ b} {$ c}. Просто что-то иметь в виду. Я не знаю, применимо ли это здесь.

...