2017-02-08 6 views
0

в цикле я извлечьPerl: используя массив для создания хэш хэш структуры

  • Массив (его длина и данные могут меняться при каждой итерации)
  • 1 Имя данных
  • 1 Значение данных

И я хотел бы создать хэш хэш, имеющий в качестве структуры массив и установить в конце данные, полученные.

Exemple, если у меня есть:

@array = ('a','b','c'); 
$dataname = 'my data'; 
$datavalue = '123'; 

Я хотел бы иметь хэш, как показано ниже:

%hash = (
    a => { 
      b => { 
       c => { 
         'my data' => '123' 
         } 
       } 
      } 
     ); 

Но я не нашел где-нибудь, как это сделать.

+1

Взгляните на ['Data :: Diver'] (http://search.cpan.org/~tyemq/Dat a-Diver-1.0101/Diver.pm) – Borodin

ответ

0

вы можете сделать это таким образом, это не самый эффективный, но он работает

use Data::Dumper; 

my @array = ('a','b','c'); 
my $dataname = 'my data'; 
my $datavalue = '123'; 

my $hash = {$dataname => $datavalue}; 

foreach my $item (reverse @array){ 
    $hash = {$item =>$hash}; 
} 
my %hash =%$hash; 
print Dumper(\%hash); 

вы получите следующий результат:

$VAR1 = { 
      'a' => { 
        'b' => { 
          'c' => { 
            'my data' => '123' 
            } 
          } 
       } 
     }; 
+0

Спасибо, я попробовал и работает для моей цели – Maximilien

3
use Data::Diver qw(DiveVal); 

DiveVal(\%hash, map \$_, @array, $dataname) = $datavalue; 

В качестве альтернативы,

sub DiveVal :lvalue { 
    my $p = \shift; 
    $p = \($$p->{$_}) for @_; 
    $$p 
} 

DiveVal(\%hash, @array, $dataname) = $datavalue; 
+0

@Hunter McMillen, [Объяснение приведенного выше кода] (http://stackoverflow.com/a/37417801/589924). В частности, прочтите раздел «Дополнительный уровень косвенности имеет много преимуществ». – ikegami

+0

спасибо, я прочитаю его. –

+0

@ Hunter McMillen, 'sub { my $ r = shift; $ r && = $ r -> {$ _} для @_; $ r } 'было бы хорошо, если бы вы захотели получить из структуры, но поскольку мы добавляем к структуре, нам нужно в итоге ссылаться на последнее значение. Вы можете сделать это, обратившись к последнему ключу специально, но дополнительный уровень косвенности делает вещи намного проще. – ikegami