Магическое присвоение $_
происходит только в том случае, если в цикле больше ничего нет:
while (<MYFILE>) {
print $_;
...
}
Если вы тоже хотите выполнить тест на ошибки - что не рекомендуется, - вам нужно выполнить задание:
my $error = 0;
while (!$error && ($_ = <MYFILE>)) {
print;
$error = 1 if m/quit/i;
}
Не забудьте добавить:
use warnings;
use strict;
Причина, по которой сработала версия с !0
, возможно, в том, что Perl оптимизирует и распознает, что '!0
' всегда истинно, и удаляет его из цикла, оставляя только оператор ввода-вывода, который затем присваивается $_
.
Примечание: гораздо лучше использовать идиоматический Perl и оператор last
:
while (<MYFILE>) {
print;
last if m/quit/i;
}