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

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

Ответы [ 5 ]

5 голосов
/ 27 мая 2011
open my $fh, '>', "out.txt" or die $!;
print $fh (join("\t", @$_), "\n") for @array;
2 голосов
/ 26 мая 2011

Я предполагаю, что ваш многомерный массив на самом деле является массивом ссылок на массивы, так как это единственный способ, которым 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);
1 голос
/ 27 мая 2011

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

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

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

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

1 голос
/ 27 мая 2011

Я надеюсь, что два измерения:

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

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

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

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

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

1 голос
/ 26 мая 2011

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

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

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

...