Причудливое чавканье файлов в Perl

Я искал эффективные способы чтения файлов в Perl и наткнулся на очень интересную строчку:

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

Мой вопрос: как именно это работает? Обычно при глотании файла вы устанавливаете $/ = undef, но я не понимаю, как это происходит. Этот небольшой фрагмент кода оказывается очень трудным для понимания.

Какова была бы упрощенная разбивка и объяснение этого?


Теперь, когда я знаю, как это работает, давайте пофантазируем!

Не то чтобы этот код имел реальное применение; это просто интересно понять и круто посмотреть. Вот однострочник, чтобы одновременно глотать несколько файлов!!!

my @texts = map { local (@ARGV, $/) = $_; <> } @files;

person tjwrona1992    schedule 05.05.2015    source источник
comment
perl позволяет присваивать несколько переменных в одном присваивании (не знаю, как это правильно называется): ($a, $b, $c) = (1, 2). $c здесь закончится undef   -  person n0rd    schedule 05.05.2015
comment
Это ужасно. Вы должны спросить, что он делает, поэтому не дублируйте его.   -  person Borodin    schedule 05.05.2015
comment
Эта строка кода на самом деле является часто используемым фрагментом кода Perl. Я видел это более чем в одном месте, что и заставило меня задать этот вопрос.   -  person tjwrona1992    schedule 05.05.2015
comment
Вот что в этом ужасного... ;-) Perl полон этих изящных маленьких ярлыков, которые слишком ужасны, чтобы их использовать, и слишком изящны, чтобы их не использовать...   -  person alexis    schedule 06.05.2015
comment
Не нужно map для нескольких файлов. my @texts = do { local (@ARGV, $/) = @files; <> };   -  person ikegami    schedule 06.05.2015
comment
(›*o*)› *с ума сойти* ‹(*o*‹)   -  person tjwrona1992    schedule 06.05.2015


Ответы (1)


local (@ARGV, $/) = $file;

такой же как

local @ARGV = ( $file );
local $/    = undef;

<> затем читает из файлов, упомянутых в @ARGV, то есть из $file.

person choroba    schedule 05.05.2015
comment
О, это имеет смысл, тогда do {} просто возвращает значение последнего вычисленного выражения, которое будет значением <> или содержимым файла. Спасибо @charoba! - person tjwrona1992; 06.05.2015
comment
@ jwrona1992, смысл do в том, чтобы ограничить область, в которой изменяются @ARGV и $/. - person ikegami; 06.05.2015