Какой самый безопасный способ перебрать строки в файле с помощью Perl?
Я обычно перебираю строки в файле, используя следующий код:
open my $fh, '<', $file or die "Could not open file $file for reading: $!\n";
while ( my $line = <$fh> ) {
...
}
Тем не мение,отвечая на другой вопрос, Эван Кэрролл отредактировал мой ответ, изменив мойwhile
заявление для:
while ( defined( my $line = <$fh> ) ) {
...
}
Его обоснование состояло в том, что если у вас есть линия, которая0
(это должна быть последняя строка, иначе будет возврат каретки)while
выйдет преждевременно, если вы использовали мое заявление ($line
будет установлен в"0"
и возвращаемое значение из присваивания, таким образом, также будет"0"
который оценивается как ложный). Если вы проверите для определенности, то вы не столкнетесь с этой проблемой. Это имеет смысл.
Вот я и попробовал. Я создал текстовый файл, последняя строка которого0
без возврата каретки. Я пропустил его через цикл, и цикл не вышел преждевременно.
Затем я подумал: «Ага, может быть, ценность на самом деле не0
, может быть, есть что-то еще, что портит все! »Так что я использовалDump()
отDevel::Peek
и вот что это мне дало:
SV = PV(0x635088) at 0x92f0e8
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0X962600 "0"\0
CUR = 1
LEN = 80
Это говорит мне о том, что значение на самом деле является строкой"0"
, как я получаю аналогичный результат, если я звонюDump()
на скаляре я явно установлен"0"
(единственное отличие - в поле LEN - из файла LEN - 80, тогда как из скалярного LEN - 8).
Так в чем же дело? Почему не мойwhile()
выход из цикла преждевременно, если я передам ему строку, которая только"0"
без возврата каретки? Является ли цикл Эвана на самом деле более оборонительным, или Perl делает что-то сумасшедшее внутри, что означает, что вам не нужно беспокоиться об этих вещах иwhile()
на самом деле выходит только когда вы нажметеeof
?