У меня есть многомерный массив с именем @main, и я хочу записать этот массив в файл .txt с разделителями табуляции в Perl. Может ли кто-нибудь помочь мне в этом вопросе?
Как написать многомерный массив в виде файла .txt с разделителями табуляции в Perl
Ответы (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);
@main
должен быть определен скобками ()
, а не квадратными скобками. Они делают ссылку на анонимный массив.
- person friedo; 26.05.2011
Это не многомерный массив, это массив, который был сформирован путем объединения трех других массивов.
perl -e '@f=(1,2,3); @g=(4,5,6); @h=(@f,@g); print join("\t",@h)."\n";'
Пожалуйста, предоставьте желаемый результат, если вам нужна дополнительная помощь.
Два измерения, я надеюсь:
foreach my $row (@array) {
print join ("\t", @{$row}) . "\n";
}
В Perl нет многомерных массивов. Вместо этого один из трех собственных типов данных представляет собой одномерный массив, называемый List. Если вам нужна более сложная структура в Perl, вы можете использовать ссылки на другие структуры данных в вашем Списке. Например, каждый элемент в вашем Списке является ссылкой на другой Список. Первичный список может представлять строки, а вторичный список — значения столбцов в этой строке.
В приведенном выше цикле foreach
выполняется цикл по основному списку (тот, который представляет каждую строку), а $row
соответствует ссылке на список, представляющий значения столбца.
Чтобы получить список Perl, а не ссылку на список, я разыменовываю ссылку на список. Я делаю это, добавляя перед ним знак @
. Мне нравится использовать @{$row}
, потому что я думаю, что это немного чище, чем просто @$row
.
Теперь, когда я могу ссылаться на свой список значений столбца как @{$row}
, я могу использовать join
для создания строки, которая разделяет каждое из значений в @{$row}
символом табуляции, и распечатать ее.
Если «многомерный» в вашем вопросе означает n > 2, формат с разделителями табуляции может оказаться невозможным.
Это тот случай, когда вы хотите решить более общую проблему: сериализовать структуру данных?
Посмотрите, например, на модуль YAML (установите YAML:: XS). Существует метод DumpFile (путь к файлу, список) и метод LoadFile (путь к файлу). Вывод не будет файлом с разделителями табуляции, но все равно будет удобочитаемым.
Вместо этого вы также можете использовать сериализатор JSON, например. JSON:: XS.
print @$_
Вы уверены, что массив будет использовать разделитель вывода записей, если вы не заключите аргумент печати в двойные кавычки?
- person TLP; 27.05.2011