Заполните хэш хэшей в Perl - PullRequest
0 голосов
/ 22 февраля 2012

Я хочу знать, как заполнить следующую хеш-структуру:

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

    ]
};

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

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

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

# 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".

2 голосов
/ 22 февраля 2012

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

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

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

0 голосов
/ 23 февраля 2012
    my $user = {
        id   => $id,
        name => $name,
    };

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

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

...