Как прочитать содержимое небольшого текстового файла в скалярном файле в 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", но это добавит дополнительные строки новой строки. Каждая строка уже имеет новую строку в конце, когда она читается.)