<>;
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 ::'命名空間中的模塊)。 –