Запись в базу данных в Hash-of-hashes - PullRequest
2 голосов
/ 13 ноября 2010

Как я могу сгенерировать хэш хэшей из серии массивов?Мне нужно перейти от этого:

my @data = /one two three/;
my $value = 13:

к этому:

$hoh = { 'one' => { 'two' => { 'three' => 13 } } };

Это используется для преобразования вывода запроса к базе данных в иерархическую структуру для визуализации.Поэтому длина @data фиксирована для всех записей, но варьируется от запроса к запросу.

Ответы [ 3 ]

7 голосов
/ 14 ноября 2010

Предполагая, что вы хотите инициализировать @data с элементами 'one', 'two' и 'three' выше, вы можете сделать что-то вроде этого: my @data = qw/one two three/; my $value = 13;</p> <p>my $hash = $value; $hash = {pop @data => $hash} while @data;

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

5 голосов
/ 14 ноября 2010

используйте List :: Util , чтобы уменьшить функцию для создания хэш-ссылки в обратном направлении, создавая хэш-значение, которое становится значением верхнего хеш-значения, начиная с $value, которое остается значением, а не ключом.,Это устраняет необходимость в деструктивных операциях, таких как pop:

my $d = reduce { +{ $b => $a } } ($value, reverse @data);

. Возможно, вам придется подавить предупреждения 'Name "main::b" used only once: possible typo at ', заключив код в блок и временно отключив предупреждение 'once' в этом блоке.с

no warnings 'once';

вот так:

use strict;
use warnings;
use List::Util 'reduce';
my @data = qw{one two three};
my $value = 13;

my $d = do {
  no warnings 'once';
  reduce { +{ $b => $a } } ($value, reverse @data);
};
0 голосов
/ 14 ноября 2010

Не так быстро или компактно, как у Swestrup'а, но, возможно, легче следовать:

my @data  = qw/one two three/;
my $value = 13;
my %h     = ( );    # This is your final hash

my $deepest = undef;
my $hr      = \%h;
for my $x (@data) {
        $hr->{$x} = { };
        $deepest  = \$hr->{$x};
        $hr       = $hr->{$x};
}
$$deepest = $value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...