Как я могу проверить eof в Perl? - PullRequest
3 голосов
/ 04 февраля 2010

Итак, у меня возникли проблемы с определением того, что делает Perl в следующем случае:

while(1){
$inputLine=<STDIN>

#parse $inputLine below
#BUT FIRST, I need to check if $inputLine = EOF

}

прежде чем я получу очевидный ответ об использовании while(<>){}, позвольте мне сказать, что есть очень веская причина, по которой я должен сделать вышеупомянутое (в основном, установка будильника для прерывания блокировки, и я не хотел, чтобы этот код загромождал пример).

Есть ли способ сравнить $inputLine == undef (как мне кажется, именно это возвращает STDIN в конце).

Спасибо.

Ответы [ 4 ]

11 голосов
/ 04 февраля 2010

Внутри вашего цикла используйте

last unless defined $inputLine;

Из документации perlfunc по defined:

определено EXPR
определяется

Возвращает логическое значение, указывающее, имеет ли EXPR значение, отличное от неопределенного значения undef. Если EXPR отсутствует, будет проверено $_.

Многие операции возвращают undef, чтобы указать на сбой, конец файла, системную ошибку, неинициализированную переменную и другие исключительные условия. Эта функция позволяет отличать undef от других значений. (Простой логический тест не будет различать undef, ноль, пустую строку и "0", которые в равной степени ложны.) Обратите внимание, что поскольку undef действительный скаляр, его наличие не обязательно указывает на исключительное условие: pop возвращает undef, когда его аргумент является пустым массивом, или когда происходит возврат элемента быть undef.

4 голосов
/ 04 февраля 2010
defined($inputLine)

Кроме того, см. версию аргумента select функции для альтернативного способа чтения из файлового дескриптора без блокировки.

0 голосов
/ 14 июля 2018

Следующее будет иметь проблемы с входными файлами, у которых есть строки, у которых есть только перевод строки или как в случае, если у меня были проблемы с FF в начале некоторых строк (Form Feed - файл был выводом из программы разработан в конце 70-х годов и до сих пор имеет форматирование для линейного принтера и все еще находится на Фортране - я скучаю по широкой непрерывной бумаге для рисования блок-схем на обороте).

open (SIMFIL, "<", 'InputFileName') or die "Can´t open InputFileName\n" ;
open (EXTRDATS, ">>", 'OutputFileName' ) or die "Can´t open OutputFileName\n";
$Simfilline = "";
while (<SIMFIL>) {
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    }
close SIMFIL;
close EXTRDATS;

` Вот когда пригодится eof - выражение: while () может возвращать false при условиях, отличных от конца файла.

open (SIMFIL, "<", 'InputFileName') or die "Can´t open InputFileName\n" ;
open (EXTRDATS, ">>", 'OutputFileName' ) or die "Can´t open OutputFileName\n";
$Simfilline = "";
while (!eof SIMFIL) {
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    $Simfilline = <SIMFIL>;
    print EXTRDATS $Simfilline;
    }
close SIMFIL;
close EXTRDATS;

Последний фрагмент кода, по-видимому, точно дублирует входной файл.

0 голосов
/ 04 февраля 2010

Вы можете использовать eof в дескрипторе файла. eof вернет 1, если следующее чтение FILEHANDLE будет EOF.

...