Вывод значения массива из хэша в perl

Я новичок в Perl, и это сводит меня с ума. У меня есть хеш, как показано ниже

%temp = (
  a_collection => [\%first, \%second]
)

Я хочу получить элементы массива в виде строки, чтобы я мог использовать их в качестве аргументов в цикле. У меня есть код ниже

foreach $item (@{$temp{'a_collection'}})
{
  <convert to json> $item  #convert each of the above hash to a json blob
  <write to file> $file    #write first blob to file "first.json" and so on
}

Я получил преобразование в JSON часть. Я могу распечатать это на стандартный вывод. Теперь я хочу записать это в файл. Здесь файл $ должен иметь имена "first" и "second". Таким образом, цикл создаст два файла с именами хеш-переменных, которые есть в вышеуказанном хеш-коде. Я хочу, чтобы имена файлов совпадали, чтобы я мог отслеживать, что создается.

Редактировать: основная предпосылка проста. Что бы я ни делал, будь то кодировка JSON и т. Д., Я хочу, чтобы имена хеш-переменных были в виде строки. Так что в приведенном выше массиве я могу иметь хеш с любым именем \%somename, в цикле я хочу, чтобы фактическая строка "somename" находилась в другой переменной. Как и выше, я могу использовать эту строку в качестве имени файла, который создается. Я не могу изменить вышеуказанную хеш-структуру. Это просто там, созданный кем-то другим, я могу только получить к нему доступ.

Спасибо

1 ответ

Учитывая следующий код:

use strict;
use warnings;

my %first  = (foo => 2, bar => 3, bat => 5);
my %second = (baz => 7, quux => 11);
my %temp   = (a_collection => [\%first, \%second]);

for my $href (@{$temp{a_collection}}) {
    for my $key (keys(%$href)) {
        print "$key: $href->{$key}\n";
    }
}

Это результат производства:

bar: 3
foo: 2
bat: 5
quux: 11
baz: 7

Изменить после предоставления новой информации:

my %first  = (foo => 2, bar => 3, bat => 5);
my %second = (baz => 7, quux => 11);
my %temp   = (first => \%first, second => \%second);

for my $key (keys(%temp)) {
    print "$key\n";
}

Изменить после того, как была предоставлена ​​еще более новая информация:

use JSON::XS;

my %first  = (foo => 2, bar => 3, bat => 5);
my %second = (baz => 7, quux => 11);
my %temp   = (first => \%first, second => \%second);

for my $key (keys(%temp)) {
    open(my $fh, '>', "$key.json") or die $!;
    print $fh encode_json($temp{$key});
    close($fh);
}

Содержание first.json:

{"foo":2,"bat":5,"bar":3}

Содержание second.json:

{"quux":11,"baz":7}
Другие вопросы по тегам