Подтвердить что ты не робот

Самый простой способ открыть текстовый файл и прочитать его в массиве с помощью 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");
4b9b3361

Ответ 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