Я обычно Переберите строк в файле, используя следующий код:Какой самый защитный способ для прокрутки строк в файле с Perl?
open my $fh, '<', $file or die "Could not open file $file for reading: $!\n";
while (my $line = <$fh>) {
...
}
Однако in answering another question, Evan Carroll отредактировал мой ответ, меняю while
заявление:
while (defined(my $line = <$fh>)) {
...
}
Его обоснование было то, что если вы есть строка, которая равна 0
(она должна быть последней строкой, иначе она будет иметь возврат каретки), тогда ваш while
уйдет преждевременно, если вы использовали мой оператор ($line
будет установлен в "0"
, и возвращаемое значение из присваивания также будет "0"
, которое получает значение false). Если вы проверяете определенность, то вы не столкнетесь с этой проблемой. Это имеет смысл.
Так что я попробовал. Я создал текстовый файл, последняя строка которого равна 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()
на скаляр I» ve явно установлен на "0"
(единственное различие в поле LEN - из файла LEN - 80, тогда как из скалярного LEN - 8).
Итак, в чем заключена сделка? Почему мой цикл while()
преждевременно выходит, если я передаю ему строку, которая только "0"
без возврата каретки? Является ли цикл Эвана более защитным, или Perl делает что-то сумасшедшее изнутри, а это значит, что вам не нужно беспокоиться об этих вещах, а while()
фактически только выходит, когда вы нажимаете eof
?
Если вы хотите написать защитный код, используйте [tank] (http://en.wikipedia.org/wiki/Tank). –
Вот почему я не отредактировал значение чей-то реакции (я только фиксирую очевидные опечатки). Добавьте комментарий вместо этого, если вы считаете, что что-то отсутствует или его можно улучшить. И вам, к счастью, для расследования внутренних дел! – Ether