Работа со структурами и хешами в Perl - PullRequest
0 голосов
/ 03 декабря 2018

Рассмотрим следующую структуру в Perl: (давайте назовем это объявлением A)

my $json_struct = {
    name => $name,
    time => $time,
};

У меня есть хеш %hash, который содержит настраиваемые поля (я не знаю, сколько).Это выглядит примерно так:

$VAR1 = {
         'key2' => '123',
         'key1' => 'abc',
         'key3' => 'xwz'
    };

Я бы хотел просмотреть циклические ключи и вставить эти ключи в структуру, поэтому я подумал, что могу сделать что-то вроде этого:

foreach my $key (keys %hash) {
  push @{ $json_struct }, { $key => $hash{$key} };
}

Я не уверен, что это работает, как ожидалось.Кроме того, есть ли более чистый способ сделать это?Может быть, я могу объединить его в одну или две строки, объявив A.?

Ожидаемый результат: (порядок не имеет значения)

$VAR1 = {
         'name' => $name,
         'time' => $time,
         'key2' => '123',
         'key1' => 'abc',
         'key3' => 'xwz'
    };

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Самый простой способ присоединиться к хешам:

my $foo = {
    name => $name,
    time => $time,
};

my $bar = {
         'key2' => '123',
         'key1' => 'abc',
         'key3' => 'xwz'
    };

my $combined = {
    %{$foo},
    %{$bar},
};
0 голосов
/ 03 декабря 2018

$json_struct является ссылкой на хеш, но @{ $json_struct } выполняет массив разыменование на $json_struct, так что не будет работать.

Нет оператора pushдля хэшей;Вы просто вставляете новые данные, присваивая значения новым ключам.Для вашей структуры вы просто хотели бы сказать

foreach my $key (keys %hash) {
    $json_struct->{$key} = $hash{$key};
}

Теперь вы можете также использовать оператор @{...}, чтобы указать срез хеша , что может быть тем, о чем вы думали.Хеш-фрагменты могут использоваться для одновременного использования нескольких ключей хеш-функции.Синтаксис, который будет работать для вас для этой операции:

@{$json_struct}{keys %hash} = values %hash;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...