Как прочитать содержимое небольшого текстового файла в скалярном файле в Perl?

У меня есть небольшой текстовый файл, который я бы хотел прочитать в скалярной переменной точно так же, как в файле (сохраняя разделители строк и другие пробелы).

Эквивалент в Python будет похож на

buffer = ""

try:
    file = open("fileName", 'rU')
    try:
        buffer += file.read()
    finally:
        file.close()
except IOError:
    buffer += "The file could not be opened."

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

Ответ 1

Из Perl Cookbook:

my $filename = 'file.txt';
open( FILE, '<', $filename ) or die 'Could not open file:  ' . $!;

undef $/;
my $whole_file = <FILE>;

Я бы локализовал изменения, хотя:

my $whole_file = '';
{
    local $/;
    $whole_file = <FILE>;
}

Ответ 2

В качестве альтернативы тому, что сказал Алекс, вы можете install Файл:: Slurp (cpan -i File::Slurp из командной строки) и используйте это:

use File::Slurp;
# Read data into a variable
my $buffer = read_file("fileName");
# or read data into an array
my @buffer = read_file("fileName");

Обратите внимание, что это die (ну... croak s, но это просто правильный способ вызова die из модуля ) об ошибках, поэтому вам может понадобиться запустить это в блоке eval, чтобы поймать любые ошибки.

Ответ 3

Если у меня нет Slurp или Perl6:: Slurp рядом с этим я обычно хожу с....

open my $fh, '<', 'file.txt' or die $!;

my $whole_file = do { local $/; <$fh> };

Ответ 4

Вы можете сделать что-то вроде:

$data_file="somefile.txt";
open(DAT, $data_file);
@file_data = <DAT>;
close(DAT);

Это даст вам содержимое файла в массиве, которое вы можете использовать для всего, что хотите, например, если вам нужна каждая отдельная строка, вы можете сделать что-то вроде:

foreach $LINE (@file_data)
{
    dosomethingwithline($LINE);
}

Для полного примера использования:

my $result;
$data_file = "somefile.txt";
my $opened = open(DAT, $data_file);
if (!$opened)
{
    $result = "Error.";
}
else
{
    @lines = <DAT>;
    foreach $LINE (@lines)
    {
        $result .= $LINE;
    }
    close(DAT);
}

Затем вы можете использовать $result, но вам нужно. Примечание. Этот код не проверен, но он должен дать вам представление.

Ответ 5

Здесь обсуждаются различные способы чтения файла здесь.

Ответ 6

У меня недостаточно репутации, чтобы комментировать, поэтому я приношу свои извинения за то, что вы сделали это еще одно сообщение.

@Гарольд Бэмфорд: $/should не - неясная переменная для программиста на Perl. Новичок может не знать этого, но он или она должен его изучить. Метод объединения является плохим выбором по причинам, указанным в статье, связанным с взломанными словами выше. Вот соответствующая цитата из статьи:

Это бесполезно разбивает входной файл на строки (объединение предоставляет контекст списка), а затем снова объединяет эти строки. Оригинальный кодер этой идиомы, очевидно, никогда не читал perlvar и не научился использовать $/, чтобы позволить скалярное разрывание.

Ответ 7

Я бы попробовал ответить draegtun так, чтобы он выполнял именно то, что задавали:

my $buffer;
if ( open my $fh, '<', 'fileName' ) {
    $buffer = do { local $/; <$fh> };
    close $fh;
} else {
    $buffer = 'The file could not be opened.';
}

Ответ 8

Просто соедините все строки в строку:

open(F, $file) or die $!;
my $content = join("", <F>); 
close F;

(Ранее было предложено использовать join "\n", но это добавит дополнительные строки новой строки. Каждая строка уже имеет новую строку в конце, когда она читается.)