Что лучший способ состоит в том, чтобы хлебать файл в строку в Perl?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
48
задан 12 revs, 3 users 88% 11 April 2012 в 19:54
поделиться

13 ответов

Как насчет этого:

use File::Slurp;
my $text = read_file($filename);

ЭТА: примечание Ошибка № 83126 для Файла - Хлебает: Дыра в системе безопасности с кодированием (UTF-8) . Я теперь рекомендую использовать File::Slurper (правовая оговорка: Я записал его), также потому что это имеет лучшие значения по умолчанию вокруг кодировки:

use File::Slurper 'read_text';
my $text = read_text($filename);

или Путь:: Крошечный :

use Path::Tiny;
path($filename)->slurp_utf8;
71
ответ дан Leon Timmermans 7 November 2019 в 12:00
поделиться

Кандидат на худший способ сделать это! (См. комментарий.)

open(F, $filename) or die "OPENING $filename: $!\n";
@lines = <F>;
close(F);
$string = join('', @lines);
1
ответ дан 2 revs 7 November 2019 в 12:00
поделиться

Это ни быстро, ни независимо от платформы, и действительно злое, но это коротко (и я видел это в коде Larry Wall;-):

 my $contents = `cat $file`;

Дети, не делайте этого дома;-).

5
ответ дан moritz 7 November 2019 в 12:00
поделиться

См. сводку Perl6:: Хлебайте , который невероятно гибок и обычно делает правильную вещь с очень небольшим усилием.

4
ответ дан brian d foy 7 November 2019 в 12:00
поделиться
{
  open F, $filename or die "Can't read $filename: $!";
  local $/;  # enable slurp mode, locally.
  $file = <F>;
  close F;
}
7
ответ дан zigdon 7 November 2019 в 12:00
поделиться
use Path::Class;
file('/some/path')->slurp;
8
ответ дан me me 7 November 2019 в 12:00
поделиться

mmap (Размещение в ОЗУ) строк может быть полезным когда Вы:

  • Имеют очень большие строки, которые Вы не хотите загружать в память
  • , Хотят вслепую быструю инициализацию (Вы добираетесь, постепенный ввод-вывод на доступе)
  • Имеют случайный или ленивый доступ к строке.
  • май хочет обновить строку, но только расширяет ее или заменяет символы:
#!/usr/bin/perl
use warnings; use strict;

use IO::File;
use Sys::Mmap;

sub sip {

    my $file_name = shift;
    my $fh;

    open ($fh, '+<', $file_name)
        or die "Unable to open $file_name: $!";

    my $str;

    mmap($str, 0, PROT_READ|PROT_WRITE, MAP_SHARED, $fh)
      or die "mmap failed: $!";

    return $str;
}

my $str = sip('/tmp/words');

print substr($str, 100,20);

Обновление: май 2012

следующее должен быть вполне прилично эквивалентным после замены Sys:: Mmap с File::Map

#!/usr/bin/perl
use warnings; use strict;

use File::Map qw{map_file};

map_file(my $str => '/tmp/words', '+<');

print substr($str, 100, 20);
10
ответ дан dwarring 7 November 2019 в 12:00
поделиться

Вещи думать о (особенно при сравнении с другими решениями):

  1. Лексические дескрипторы файлов
  2. Уменьшают объем
  3. , Уменьшают волшебство

, Таким образом, я добираюсь:

my $contents = do {
  local $/;
  open my $fh, $filename or die "Can't open $filename: $!";
  <$fh>
};

я не большой поклонник волшебства <> кроме тех случаев, когда на самом деле с помощью волшебства <>. Вместо того, чтобы обмануть его, почему не только используют прослушивание непосредственно? Это не намного больше работы и явно. (Истинное волшебство <>, особенно при обработке "-", намного больше работы для прекрасной эмуляции, но мы не используем ее здесь так или иначе.)

11
ответ дан Tanktalus 7 November 2019 в 12:00
поделиться
open(my $f, '<', $filename) or die "OPENING $filename: $!\n";
$string = do { local($/); <$f> };
close($f);
21
ответ дан 3 revs, 3 users 60% 7 November 2019 в 12:00
поделиться

В записи File::Slurp (который является лучшим способом), Uri Guttman провел большое исследование многими способами хлебать и который является самым эффективным. Он записал его результаты здесь и включил их информация File::Slurp.

35
ответ дан Schwern 7 November 2019 в 12:00
поделиться

Мне нравится делать это с do блок, в котором я локализую @ARGV, таким образом, я могу использовать ромбовидный оператор, чтобы сделать волшебство файла для меня.

 my $contents = do { local(@ARGV, $/) = $file; <> };

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

при необходимости в чем-то действительно устойчивом, которое обрабатывает все виды особых случаев, используйте File::Slurp . Даже если Вы не собираетесь использовать его, смотреть на источник для наблюдения всех дурацких ситуаций, это должно обработать. File::Slurp имеет большая проблема безопасности , который не надеется иметь решение. Часть этого является своим отказом правильно обработать кодировку. Даже мой быстрый ответ имеет ту проблему. Если необходимо обработать кодирование (возможно, потому что Вы не делаете все UTF-8 по умолчанию), это расширяется до:

my $contents = do {
    open my $fh, '<:encoding(UTF-8)', $file or die '...';
    local $/;
    <$fh>;
    };

, Если Вы не должны изменять файл, Вы могли бы быть в состоянии использовать File::Map .

44
ответ дан Nigel B. Peck 7 November 2019 в 12:00
поделиться
# Takes the name of a file and returns its entire contents as a string.
sub getfile 
{
  my($filename) = @_;
  my($result);

  open(F, $filename) or die "OPENING $filename: $!\n";
  while(<F>) { $result .= $_; }
  close(F);

  return $result;
}
-1
ответ дан 2 revs 7 November 2019 в 12:00
поделиться

Вот хорошее сравнение наиболее популярных способов сделать это:

http://poundcomment.wordpress.com/2009/08/02/perl-read-entire-file /

3
ответ дан 7 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: