2010-10-25 2 views
2

Я посмотрел на источник Slurp, и я хотел бы, чтобы понять, как делает slurp() работу:Как работает модуль Slurp Perl?

sub slurp { 
    local($/, @ARGV) = (wantarray ? $/ : undef, @_); 
    return <ARGV>; 
} 

Где файл даже открыт?

+0

Связанные http://stackoverflow.com/q/206661/100754 и http://stackoverflow.com/questions/2213485/how-do-i -read-a-files-contents-in-perl-scalar Я не вижу причин использовать этот модуль. –

ответ

6

См. ARGV и $/ в perldoc perlvar.

См. Также Path::Class:File::slurp.

+0

Обратите внимание, что File :: Slurp теперь считается сломанным, так как он не знает, что делать с кодировками, и он медленный. См. Http://blogs.perl.org/users/leon_timmermans/2013/05/why-you-dont-need-fileslurp.html –

+0

@briandfoy Я очень любил [Path :: Class] (https: // metacpan.org/pod/Path::Class) и изменил мою рекомендацию, чтобы отразить это. –

1

Этот фрагмент помещает имя файла в @ARGV. Файл дескриптора ARGV неявно открывает файлы, которые он видит в @ARGV. Это тот же дескриптор файла, который мы не видим в алмазном операторе <>, так как это стандартный дескриптор файла для этого оператора.

Это же Perl идиома как:

my $data = do { local(@ARGV, $/) = $file; <> }; 
Смежные вопросы