5 perl loops statement-modifiers while-loop
我是Perl的新手.虽然知道一点C.我在课堂笔记中看到了这个片段:
$STUFF = "C:/scripts/stuff.txt";
open STUFF or die "Cannot open $STUFF for read: $!";
print "Line $. is: $_" while (<STUFF>);
Run Code Online (Sandbox Code Playgroud)
为什么while在之后print的语句?它有什么作用?
cha*_*aos 11
它是一样的
while (<STUFF>) {
print "Line $. is : $_";
}
Run Code Online (Sandbox Code Playgroud)
它的编写方式是因为它更简单,更紧凑.一般来说,这是条件和循环的Perl (in)着名的"语句修饰符"形式.
其他答案解释了while循环的语句修饰符形式.然而,这里还有很多其他的魔法.特别是,该脚本依赖于Perl的三个特殊变量.其中两个($_和$!)很常见; 另一个($.)相当普遍.但他们都值得知道.
当您while <$fh>在打开的文件句柄上运行时,Perl会逐行自动运行该文件,直到它命中EOF.在每个循环中,当前行设置为$_不做任何操作.所以这两个是一样的:
while (<$fh>) { # something }
while (defined($_ = <$fh>)) { # something }
Run Code Online (Sandbox Code Playgroud)
请参阅perldoc perlop有关I/O运算符的部分.(有些人觉得这太不可思议,所以他们用while (my $line = <$fh>)相反.这让你$line的每一行,而不是$_,这是一个更清晰的变量名,但它需要更多的输入.对每一个他或她自己.)
$!保存系统错误的值(如果设置了一个).有关如何以及何时使用此功能的更多信息perldoc perlvar,请参阅上一节$OS_ERROR.
$.持有一个行号.参见perldoc perlvar章节$NR.这个变量可能会非常棘手.它不一定具有您当前正在阅读的文件的行号.一个例子:
#!/usr/bin/env perl
use strict;
use warnings;
while (<>) {
print "$ARGV: $.\n";
}
Run Code Online (Sandbox Code Playgroud)
如果将其另存为lines并运行perl lines file1 file2 file3,则Perl将直接计算文件1,文件2和文件3中的行.您可以看到Perl知道它正在读取的文件(它在$ ARGV中;文件名将是正确的),但它不会在每个文件的末尾自动重置行编号.我提到这一点,因为我不止一次这种行为,直到我终于通过我的(粗)头骨.您可以重置编号以便以这种方式跟踪单个文件:
#!/usr/bin/env perl
use strict;
use warnings;
while (<>) {
print "$ARGV: $.\n";
}
continue {
close ARGV if eof;
}
Run Code Online (Sandbox Code Playgroud)
您还应该查看strict和warningspragma并查看更新的,三参数形式open.我只是注意到你是" 未知(谷歌) ",这意味着你可能永远不会回来.我想我至少得到了当天的打字练习.