为什么不<>设置$ _,但while(<>){}呢?

new*_*erl 1 perl

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

但这有效:

while(<>){
  print $_;
}
Run Code Online (Sandbox Code Playgroud)

为什么第一个版本不起作用?

Cha*_*ens 10

因为while (<>)是简写while(defined($_ = <ARGV>)),但是<>;正好<ARGV>;.你可以通过B::Deparse模块看到这一点.

给定文件 example.pl

#!/usr/bin/perl

use strict;
use warnings;

<>;

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

命令

perl -MO=Deparse example.pl
Run Code Online (Sandbox Code Playgroud)

将打印

use warnings;
use strict 'refs';
<ARGV>;
while (defined($_ = <ARGV>)) {
    ();
}
example.pl syntax OK
Run Code Online (Sandbox Code Playgroud)

这是Perl着名的DWIM ery的一个例子.我相信它是为了阻止人们做浪费

for (<>) {
}
Run Code Online (Sandbox Code Playgroud)

<>在void上下文中对特殊外壳没有任何价值,事实上,它可能是有害的,因为当你说<>;你经常试图丢弃你不想要的文件句柄行.有$_抓它不会是有效的还是可取的.

  • `-Mmodule = arg1,arg2`相当于`use module qw/arg1 arg2 /;`,所以`-MO = Deparse`相当于`use O qw/deparse /;`.[`O`](http://perldoc.perl.org/O.html)模块可以轻松加载多个后端模块(即`B ::`命名空间中的模块). (5认同)