Самый простой способ открыть текстовый файл и прочитать его в массив с помощью Perl - PullRequest
20 голосов
/ 17 апреля 2009

Добавление стандартной функции открытия файла Perl к каждому имеющемуся скрипту немного раздражает:

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");

Ответы [ 8 ]

27 голосов
/ 18 апреля 2009

У вас есть несколько вариантов, классический метод 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;

Метод File :: Slurp :

use File::Slurp;

my @array = read_file($filename);

И, вероятно, еще много, в конце концов TIMTOWTDI .

15 голосов
/ 17 апреля 2009

Я думаю, это то, что вы ищете

File :: Slurp

15 голосов
/ 17 апреля 2009

, который является известным "режимом slurp":

  my @lines = <FILEHANDLE> ;

Вы также можете увидеть Perl Slurp Ease

6 голосов
/ 18 апреля 2009

Также взгляните на 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 голосов
/ 17 апреля 2009

Вы также можете рассмотреть возможность использования Tie :: File, особенно если вы читаете большие файлы и не хотите читать весь файл в память. Это основной модуль. Также, пожалуйста, обратитесь к perlfaq5 .

4 голосов
/ 17 апреля 2009

Вы получили общие приемы, но я хочу добавить, что Perl отговаривает вас от этого, потому что очень часто бывает, что вы можете сделать то же самое, что и один -линейно, что по своей сути гораздо эффективнее.

2 голосов
/ 17 апреля 2009

Для быстрого и грязного, мне скорее нравится простота гадости с @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 * не может открыть файл, он автоматически умирает.

<Ч />

* - исполняемый файл, поэтому, пожалуйста, не пишите с большой буквы.

1 голос
/ 19 апреля 2009

Я бы порекомендовал объектно-ориентированный подход, который не требует модулей вне дистрибутива CORE и будет работать где угодно:

use strict;
use warnings;
use IO::File;
my $fh = IO::File->new("< $file");

foreach ($fh->getlines) {
    do_something($_);
}
$fh->close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...