2015-11-19 3 views
-6

Я новичок в 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. Я могу напечатать его на stdout. Теперь я хочу записать его в файл. Здесь $ file должен иметь имя «первый» и «второй». Таким образом, цикл создаст два файла с именами хэш-переменных, которые находятся в вышеупомянутом хэше. Я хочу, чтобы имена файлов совпадали, поэтому я могу отслеживать, что создается.

Редактировать: Основная посылка проста. Независимо от того, что я делаю, будь то кодировка json и т. Д., Я хочу, чтобы имена переменных хеши были строкой. Поэтому в массиве выше я могу иметь хэш с любым именем \% somename, в цикле я хочу, чтобы фактическая строка «somename» в другой переменной. Как и выше, я могу использовать эту строку в качестве имени файла, которое создается. Я не могу изменить вышеупомянутую структуру хэша. Его просто там, созданный кем-то другим, я могу получить к нему доступ.

Благодаря

+0

Ваш цикл не соответствует данным которую вы разместили выше. Что такое * фактический * код, который вы используете? –

+0

@ user775093 что вы на самом деле пытаетесь? Вы ссылаетесь на хэш внутри хеша массива? Если вы хотите это сделать, см. Ниже ответ. Или что-нибудь еще отредактируйте свой пост? – mkHun

+1

Вы полностью изменили вопрос, и он все еще так же неясен, как и прежде, но основная предпосылка моего ответа по-прежнему остается прежней: хеш-ключи. –

ответ

0

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

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 

Edit после новой информации была предоставлена:

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"; 
} 

Edit после была представлена ​​еще более новая информация:

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} 
+0

Это не то, что я хочу. Результат должен быть «первым» и «вторым». – user775093

+2

. Тогда вы, вероятно, должны создать хеш с ключами «first» и «second». –

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