Perl while循环/读取文件

buf*_*run 2 perl

我是Perl的新手,在逐行读取文件时遇到问题.我从一个建议使用while循环的教程开始.这工作正常,但我想有一个选项,以便在出现错误时突破循环.我知道我可以使用"last"关键字,但我不太喜欢它,我想将它包含在while循环的布尔表达式中,以便更容易看到它停止的条件.所以我做了

$error=0;
while ( (!$error) && (<MYFILE>) ) {
print $_;
...    
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,因为$ _似乎包含"未初始化的值".出于某种原因,当我将(!$ error)更改为(!0)时,它再次起作用.如果我使用了||,我会理解它不起作用 因为懒惰的评估,但在这种情况下使用&&需要对双方进行评估,所以我不明白它为什么不初始化行变量.

Jon*_*ler 5

$_只有在循环中没有其他内容时才会发生神奇的赋值:

while (<MYFILE>) {
    print $_;
    ...    
}
Run Code Online (Sandbox Code Playgroud)

如果你也想要错误测试 - 这是不推荐的 - 那么你需要完成任务:

my $error = 0;
while (!$error && ($_ = <MYFILE>)) {
    print;
    $error = 1 if m/quit/i;
}
Run Code Online (Sandbox Code Playgroud)

别忘了添加:

use warnings;
use strict;
Run Code Online (Sandbox Code Playgroud)

' !0'工作的版本之所以可能是因为Perl优化并认识到' !0'始终为真,并将其从循环中删除,只留下I/O运算符,然后分配给它$_.

注意:使用惯用的Perl和last声明要好得多:

while (<MYFILE>) {
    print;
    last if m/quit/i;
}
Run Code Online (Sandbox Code Playgroud)