Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Как насчет этого:
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;
Кандидат на худший способ сделать это! (См. комментарий.)
open(F, $filename) or die "OPENING $filename: $!\n";
@lines = <F>;
close(F);
$string = join('', @lines);
Это ни быстро, ни независимо от платформы, и действительно злое, но это коротко (и я видел это в коде Larry Wall;-):
my $contents = `cat $file`;
Дети, не делайте этого дома;-).
См. сводку Perl6:: Хлебайте , который невероятно гибок и обычно делает правильную вещь с очень небольшим усилием.
{
open F, $filename or die "Can't read $filename: $!";
local $/; # enable slurp mode, locally.
$file = <F>;
close F;
}
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);
Вещи думать о (особенно при сравнении с другими решениями):
, Таким образом, я добираюсь:
my $contents = do {
local $/;
open my $fh, $filename or die "Can't open $filename: $!";
<$fh>
};
я не большой поклонник волшебства <> кроме тех случаев, когда на самом деле с помощью волшебства <>. Вместо того, чтобы обмануть его, почему не только используют прослушивание непосредственно? Это не намного больше работы и явно. (Истинное волшебство <>, особенно при обработке "-", намного больше работы для прекрасной эмуляции, но мы не используем ее здесь так или иначе.)
open(my $f, '<', $filename) or die "OPENING $filename: $!\n";
$string = do { local($/); <$f> };
close($f);
В записи File::Slurp (который является лучшим способом), Uri Guttman провел большое исследование многими способами хлебать и который является самым эффективным. Он записал его результаты здесь и включил их информация File::Slurp.
Мне нравится делать это с 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 .
# 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;
}
Вот хорошее сравнение наиболее популярных способов сделать это:
http://poundcomment.wordpress.com/2009/08/02/perl-read-entire-file /