Perl,如何从循环外的stdin读取?

hl0*_*37_ 2 perl input readfile

有些事情我不明白:

in是一个文件包含:

1
2
3
Run Code Online (Sandbox Code Playgroud)

并且foo.pl:

use strict;
<>;
print;
<>;
print;
<>;
print;
Run Code Online (Sandbox Code Playgroud)

然后运行:

perl foo.pl < in
Run Code Online (Sandbox Code Playgroud)

为什么这个程序不输出任何东西?

......这一个:

use strinct;
while(<>) {
    print;
}
Run Code Online (Sandbox Code Playgroud)

输出整个文件

TLP*_*TLP 6

因为

while(<>) 
Run Code Online (Sandbox Code Playgroud)

是简写

while($_ = <>) 
Run Code Online (Sandbox Code Playgroud)

这意味着该行被分配给默认变量$_.哪个也用了print.

你写的:

<>;
Run Code Online (Sandbox Code Playgroud)

不分配任何东西$_.它只是void上下文中的readline,这意味着该值被丢弃并且不存储在任何地方.因此$_是空的.如果你use warnings,Perl会告诉你发生了什么.

Use of uninitialized value $_ in print
Run Code Online (Sandbox Code Playgroud)

如果您手动执行分配,它将起作用:

$_ = <>;
Run Code Online (Sandbox Code Playgroud)

另请注意,您不必重定向文件内容,只需提供文件名作为参数:

perl foo.pl in
Run Code Online (Sandbox Code Playgroud)

  • @ hl037_嗯...`print <>`将打印所有行.你也可以做一个后缀循环:`print for <>`.如果你只想打印一行,`print scalar <>`(或者将文件句柄放在标量上下文中的任何其他方法,例如`print"".<>`).TIMTOWTDI是Perl方式. (2认同)
  • <pedantic>`while(<>)`是`while(定义($ _ = <>))`</ pedantic>的简写 (2认同)