Perl пока цикл / чтение файла - PullRequest
2 голосов
/ 25 августа 2010

Я новичок в Perl, и у меня есть проблема при чтении файла построчно. Я начал с учебника, в котором предлагалось использовать цикл while. Это работало нормально, однако я хотел иметь возможность выйти из цикла в случае ошибки. Я знаю, что могу использовать ключевое слово «last», но мне это не очень нравится, я хотел бы включить его в логическое выражение цикла while, чтобы было легче увидеть, при каких условиях он останавливается. Так я и сделал

$error=0;
while ( (!$error) && (<MYFILE>) ) {
print $_;
...    
}

К сожалению, это не работает, потому что $ _, кажется, содержит "неинициализированное значение". По какой-то причине, когда я изменяю (! $ Error) на (! 0), он снова работает. Я бы понял, что это не работает, если бы я использовал || из-за ленивых вычислений, но с && в этом случае нужно вычислять обе стороны, поэтому я не понимаю, почему он не инициализирует строковую переменную.

Ответы [ 2 ]

5 голосов
/ 25 августа 2010

Магическое присвоение $_ происходит только в том случае, если в цикле больше ничего нет:

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;
}
3 голосов
/ 25 августа 2010

Во-первых, как отмечает Джонатан, вы всегда должны писать языки идиоматически, если только у вас нет веских причин, а здесь нет.

Ваша большая проблема - неправильное понимание цикла while. Автоматическое присвоение результата оператора угла для $_ происходит только в том случае, если оно является единственным в условном тесте while. Если в условном тесте есть несколько элементов, они оцениваются и затем отбрасываются ( Программирование Perl стр. 80-81 и Операторы ввода-вывода в Perldoc ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...