Самый простой способ открыть текстовый файл и прочитать его в массиве с помощью Perl
Добавление стандартной функции открытия файла Perl для каждого script У меня немного раздражает:
sub openfile{
(my $filename) = @_;
open FILE,"$filename" or die $!;
my @lines = <FILE>;
return @lines;
}
и я могу создать модуль Perl для этого, но это так просто. Я уверен, что там уже должен быть один.
Я пытаюсь найти способ прочитать текстовый файл в массиве, и я не могу найти модуль Perl, который может выполнить эту простую задачу... может быть, я слишком много смотрю, и это уже поставляется со стандартной установкой 5.10.
Оптимально я считаю, что это будет выглядеть примерно так:
my @lines = Module::File::Read("c:\some\folder\structure\file.txt");
Ответы
Ответ 1
У вас есть несколько вариантов, классический метод do:
my @array = do {
open my $fh, "<", $filename
or die "could not open $filename: $!";
<$fh>;
};
Метод IO:: All:
use IO::All;
my @array = io($filename)->slurp;
Файл:: Slurp:
use File::Slurp;
my @array = read_file($filename);
И, вероятно, еще много, в конце концов TIMTOWTDI.
Ответ 2
который является знаменитым режимом "slurp":
my @lines = <FILEHANDLE> ;
вы также можете увидеть Perl Slurp Ease
Ответ 3
Я думаю, что это то, что вы ищете
Файл:: Slurp
Ответ 4
Вы также можете рассмотреть использование Tie:: File, особенно если вы читаете большие файлы и не хотите читать весь файл в памяти. Это основной модуль. Кроме того, обратитесь к perlfaq5.
Ответ 5
Также посмотрите Perl6:: Slurp, который реализует версию slurp Perl6 и рекомендуется в книге "Perl Best Practices".
Некоторые примеры....
my @lines = slurp 'filename';
my @lines_chomped = slurp 'filename', { chomp => 1 };
my @lines_utf8 = slurp 'filename', { utf8 => 1 };
Ответ 6
У вас есть общие методы, но я хочу добавить, что Perl отвлекает вас от этого, потому что он очень часто может делать то же самое, что вы делаете один-лайн-в-время, что по своей сути гораздо более эффективно.
Ответ 7
Для быстрой и грязной я предпочитаю простоту сбрасывания с @ARGV
.
# Ysth is right, it doesn't automatically die; I need another line.
use 5.010;
use strict;
my @rows = do {
use warnings FATAL => 'inplace'; # oddly enough, this is the one. ??
@ARGV='/a/file/somewhere';
<>;
};
say q(Not gettin' here.);
Если perl * не может открыть файл, он автоматически умирает.
* - исполняемый файл, поэтому, пожалуйста, не используйте заглавные буквы.
Ответ 8
Я бы рекомендовал объектно-ориентированный подход, который не требует модулей вне дистрибутива CORE и будет работать где угодно:
use strict;
use warnings;
use IO::File;
my $fh = IO::File->new("< $file");
foreach ($fh->getlines) {
do_something($_);
}
$fh->close