Как написать многомерный массив в виде файла .txt с разделителями табуляции в Perl

У меня есть многомерный массив с именем @main, и я хочу записать этот массив в файл .txt с разделителями табуляции в Perl. Может ли кто-нибудь помочь мне в этом вопросе?


person BioLounge    schedule 26.05.2011    source источник


Ответы (5)


Я предполагаю, что ваш многомерный массив на самом деле представляет собой массив ссылок на массивы, поскольку это единственный способ, которым Perl позволит вам встроить массив в массив.

Так, например:

@array1 = ('20020701', 'Sending Mail in Perl', 'Philip Yuson');
@array2 = ('20020601', 'Manipulating Dates in Perl', 'Philip Yuson');
@array3 = ('20020501', 'GUI Application for CVS', 'Philip Yuson');

@main = (\@array1, \@array2, \@array3);

Чтобы распечатать их в файл:

open(my $out, '>', 'somefile.txt') || die("Unable to open somefile.txt: $!");
foreach my $row (@main) {
    print $out join(",", @{$row}) . "\n";
}
close($out);
person Adam Batkin    schedule 26.05.2011
comment
Ваш @main должен быть определен скобками (), а не квадратными скобками. Они делают ссылку на анонимный массив. - person friedo; 26.05.2011
comment
@BioLounge: Что здесь не работает? Я только что протестировал его, и он отлично работает для меня. - person Adam Batkin; 27.05.2011

Это не многомерный массив, это массив, который был сформирован путем объединения трех других массивов.

perl -e '@f=(1,2,3); @g=(4,5,6); @h=(@f,@g); print join("\t",@h)."\n";'

Пожалуйста, предоставьте желаемый результат, если вам нужна дополнительная помощь.

person Seth Robertson    schedule 26.05.2011

Два измерения, я надеюсь:

 foreach my $row (@array) {
     print join ("\t", @{$row}) . "\n";
 }

В Perl нет многомерных массивов. Вместо этого один из трех собственных типов данных представляет собой одномерный массив, называемый List. Если вам нужна более сложная структура в Perl, вы можете использовать ссылки на другие структуры данных в вашем Списке. Например, каждый элемент в вашем Списке является ссылкой на другой Список. Первичный список может представлять строки, а вторичный список — значения столбцов в этой строке.

В приведенном выше цикле foreach выполняется цикл по основному списку (тот, который представляет каждую строку), а $row соответствует ссылке на список, представляющий значения столбца.

Чтобы получить список Perl, а не ссылку на список, я разыменовываю ссылку на список. Я делаю это, добавляя перед ним знак @. Мне нравится использовать @{$row}, потому что я думаю, что это немного чище, чем просто @$row.

Теперь, когда я могу ссылаться на свой список значений столбца как @{$row}, я могу использовать join для создания строки, которая разделяет каждое из значений в @{$row} символом табуляции, и распечатать ее.

person David W.    schedule 26.05.2011

Если «многомерный» в вашем вопросе означает n > 2, формат с разделителями табуляции может оказаться невозможным.

Это тот случай, когда вы хотите решить более общую проблему: сериализовать структуру данных?

Посмотрите, например, на модуль YAML (установите YAML:: XS). Существует метод DumpFile (путь к файлу, список) и метод LoadFile (путь к файлу). Вывод не будет файлом с разделителями табуляции, но все равно будет удобочитаемым.

Вместо этого вы также можете использовать сериализатор JSON, например. JSON:: XS.

person knb    schedule 26.05.2011

person    schedule
comment
Что случилось с изящным искусством использования специальных переменных? { местный $,=\t; местный $\=\n; print @$_ foreach @h } ($ — это разделитель выходных полей, а $\ — разделитель выходных записей, локальный используется, чтобы не загрязнять остальную часть кода) - person mirod; 27.05.2011
comment
@mirod print @$_ Вы уверены, что массив будет использовать разделитель вывода записей, если вы не заключите аргумент печати в двойные кавычки? - person TLP; 27.05.2011
comment
похоже, попробуйте так (unix): perl -e'@h=([1,2,3], [4,5,6]); $,=\т; $\=\n; print @$_ foreach @h ' (также, если это неясно, я действительно не рекомендую это делать ;--) - person mirod; 27.05.2011
comment
Ах, я вижу, что вы там сделали сейчас, когда я действительно прочитал то, что вы написали. =П - person TLP; 27.05.2011