2012-02-22 6 views
0

Я хочу знать, как заполнить следующую хэш структуру:Populate хэш хэшей в Perl

my $hash = { 
    'user' => [ 
     { 
      'id' => '1', 
      'name' => 'John' 
     }, 
     { 
      'id' => '2', 
      'name' => 'Pat' 
     } 

    ] 
}; 

Я хочу, чтобы иметь возможность динамически заполнить этот хэш. Я хочу объединить значения из моей базы данных и нажать (добавить) новые значения (id, name), чтобы заполнить хэш.

+0

@Benoit: Неправильно, на самом деле, он использует анонимный хэш ссылки. Он мог бы использовать 'my% hash = (...);' –

+0

Как точно выглядят значения из вашей базы данных? Большинство API-интерфейсов уровня данных уже возвращают данные в ** точно ** в этом формате, поэтому вам не нужно ничего делать. – DVK

ответ

2

Для того, чтобы заполнить значение в хэш хэшей, можно просто использовать:

my %hash; 
.... 
$hash{$key}{$subkey} = $value; 

Будьте осторожны, когда вы цикл через них, однако! Скалярное значение $hash{$key} фактически будет скаляром с ссылкой на суб-хэш, а не на суб-хэш-объект.

+1

Он использует хеш-ссылку, поэтому он должен быть '$ hash -> {$ hey} {$ subkey} = $ value;' –

+0

справедливо, я честно предположил, что он имел в виду '% hash' сам :) – asf107

+0

Спасибо Platinum Azure и asf107. Поскольку я динамически заполняю этот хеш, как добавить новые значения? Вот мой код. Как вы можете видеть, это не сработает, потому что предыдущее значение всегда будет перезаписано. \t foreach my $ user (@users) { \t \t $ hash -> {user} {id} = $ user [0]; \t \t $ hash -> {user} {name} = $ user [1]; \t} Thanks –

3

Чтобы добавить еще один элемент в эту структуру:

# Get the element 
my $hashRef = { 
    'id' => '1', 
    'name' => 'John' 
}; 
# You didn't specify what you have as far as DB data 
my $hashRef = someMethodReturningDatabaseData(); 

# Add to the arrayref: 
my $hash = { user => [] }; # Initialize - only once 
$hash->{user} ||= []; # As alternative, always make sure to have an arrayref, 
         # on every iteration 
# Add to the array ref 
push @{ $hash->{user} }, $hashRef; 

Основываясь на ваш комментарий к другому ответу, вы можете сделать

my $hash = { user => [] }; # Initialize - only once 
foreach my $user (@users) { 
    push @{ $hash->{user} }, { id => $user->[0], name => $user->[1] }; 
} 

Как примечание, ваша структура данных выглядит очень странно, - это не ясно, зачем нужен внешний хэш только с одним жестко запрограммированным ключом «user».

+0

+1 для '|| ='. С другой стороны, с Perl 5.14 разыменование массива ref больше не требуется (http://perldoc.perl.org/functions/push.html). – Martin

+3

@Martin - хорошая точка. Я все еще придерживаюсь 5.8/5.005 land :( – DVK

+0

@Martin, Может быть, но это экспериментально, и имеет ошибки (не работает на всех массивах, не автовивит). – ikegami

0
my $user = { 
     id => $id, 
     name => $name, 
    }; 

    push @{ $hash->{user} }, $user; 

Нит: $hash->{user} должен быть назван $hash->{users}

Смежные вопросы