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

时间:2011-07-27 01:30:20

标签: perl

<>;
print $_

但这有效:

while(<>){
  print $_;
}

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

3 个答案:

答案 0 :(得分:10)

因为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 ery的一个例子。我认为这样做是为了阻止人们做浪费

for (<>) {
}

在void上下文中,特殊套管<>没有任何价值,事实上,它可能是有害的,因为当你说<>;时,你经常试图抛弃一条线不想从文件句柄。让$_抓住它不会有效或不可取。

答案 1 :(得分:3)

Perl while (<>)语句隐含了对$_的分配,这在第一个代码段中缺失。

man perlop

中对此进行了描述
  

当且仅当输入符号是while语句条件内的唯一内容时(即使伪装成for(;;)循环),该值将自动分配给全局变量$ _ ,摧毁以前的任何东西。

答案 2 :(得分:1)

因为第二个是特例,就像你写的那样:

while (defined($_ = <>)) {

第一个不是特例。既然你没有存储 输入线在任何地方,都没有得到保存。