印刷后的一段时间是什么意思?

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)着名的"语句修饰符"形式.

  • 它更简单.对于每个背景,每个人的直觉都是显而易见的.当你判断两件事相对于彼此是否更简单或更复杂时,我真的认为你必须假设观众知道两者的意思,而不是说"哦,这更复杂,因为我知道C而不是Perl". (3认同)
  • 我真正的意思是,从Occam的Razor角度讲,它更简单:它需要的实体更少。Perl中的附件形式的条件和循环需要一个BLOCK,因此需要它的附件字符(和缩进,如果一个人有任何类的话)。语句修饰符形式没有。 (3认同)

Tel*_*hus 7

其他答案解释了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)

您还应该查看strictwarningspragma并查看更新的,三参数形式open.我只是注意到你是" 未知(谷歌) ",这意味着你可能永远不会回来.我想我至少得到了当天的打字练习.

  • 好主!我认为C是最复杂的语言.Perl也做了很多隐藏的事情.就未知(谷歌)而言,我现在是一名学生; 这里有太多的老师让我暴露自己:-),也许以后我会努力成为自己.我给你了+1 BTW :-) (2认同)