Какой самый безопасный способ перебрать строки в файле с помощью 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?

Ответы на вопрос(3)

Ваш ответ на вопрос