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

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

Эквивалентом в Python будет что-то вроде

buffer = ""

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

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

Ответы [ 8 ]

19 голосов
/ 28 января 2009

Из поваренной книги Perl :

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>;
}
18 голосов
/ 28 января 2009

В качестве альтернативы тому, что сказал Алекс, вы можете установить модуль File :: 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 s (хорошо ... croak s, но это просто правильный способ вызова die из модуля) при ошибках, поэтому вам может потребоваться запустить это в блок eval для отлова ошибок.

15 голосов
/ 29 января 2009

Если у меня нет Slurp или Perl6 :: Slurp поблизости, я обычно иду с ....

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

my $whole_file = do { local $/; <$fh> };
1 голос
/ 27 февраля 2009

Я бы подправил ответ дрегтуна следующим образом, чтобы он точно делал то, о чем его просили:

my $buffer;
if ( open my $fh, '<', 'fileName' ) {
    $buffer = do { local $/; <$fh> };
    close $fh;
} else {
    $buffer = 'The file could not be opened.';
}
1 голос
/ 02 февраля 2009

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

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

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

1 голос
/ 28 января 2009

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

1 голос
/ 28 января 2009

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

$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 так, как вам нужно. Примечание. Этот код не проверен, но он должен дать вам представление.

0 голосов
/ 28 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...