<>;
print $_
但这个工程:
while(<>){
print $_;
}
为什么没有第一个版本的工作?
<>;
print $_
但这个工程:
while(<>){
print $_;
}
为什么没有第一个版本的工作?
因为while (<>)
为while(defined($_ = <ARGV>))
简写,但<>;
只是<ARGV>;
。你可以在B::Deparse
模块中看到。
鉴于文件example.pl
#!/usr/bin/perl
use strict;
use warnings;
<>;
while (<>) {
}
命令
perl -MO=Deparse example.pl
将打印
use warnings;
use strict 'refs';
<ARGV>;
while (defined($_ = <ARGV>)) {
();
}
example.pl syntax OK
这是Perl的著名DWIM红霉素的例子。我相信这是为了从做阻止人们浪费
for (<>) {
}
有一个在无效的情况下没有价值的特殊外壳<>
,并且,事实上,它很可能是有害的,因为当你说<>;
你最经常试图从文件句柄中丢弃你不想要的一行。有$_
捕捉它不会是有效的或理想的。
Perl while (<>)
声明有一个隐式赋值给$_
,这在您的第一个片段中缺失。
这man perlop描述:
当且仅当输入符号是条件一个
while
说明(即使伪装成for(;;)
环)的内部的唯一事情,该值被自动分配给全局变量$ _,摧毁之前有的东西。
因为:第二个是一个特例,因为如果你这样写:
while (defined($_ = <>)) {
一日一并不是一个特例。由于您没有在任何地方存储 输入行,因此未保存。
'-MO'是什么意思?我可以找到'-M''-O',但不是'-MO'。 –
'-Mmodule = arg1,arg2'等价于'use module qw/arg1 arg2 /;',所以'-MO = Deparse'是相当于'使用O qw/deparse /;'。 ['O'](http://perldoc.perl.org/O.html)模块可以轻松加载多个后端模块(即'B ::'命名空间中的模块)。 –