2012-03-27 37 views
7
use Modern::Perl; 
use DateTime; 
use autodie; 

my $dt; 

open my $fh, '<', 'data.txt'; 

# get the first date from the file 
while (<$fh> && !$dt) { 
    if (/^(\d+:\d+:\d+)/) { 
     $dt = DateTime->new(...); 
    } 
    print; 
} 

我期待这个循环读取文件的每一行,直到读取第一个日期时间值。

代替$ _是unitialised,我也得到“未初始化值$ _的模式匹配”(和打印)消息的负载。

任何想法,为什么出现这种情况?

一个

+0

ActiveState perl v5.14.1 – Richard 2012-03-27 12:06:49

回答

20

$_,如果您使用的形式while (<$fh>)形式,你是不是只设置。

看看这个:

$ cat t.pl 
while (<$fh>) { } 
while (<$fh> && !$dt) { } 

$ perl -MO=Deparse t.pl 
while (defined($_ = <$fh>)) { 
    (); 
} 
while (<$fh> and not $dt) { 
    (); 
} 
t.pl syntax OK 

perlop文档:

通常必须返回值赋值给一个变量,但有一个地方自动分配一个发生的情况。 当且仅当输入符号是一个while语句(即使伪装成一个为(;;)循环)的条件内唯一,该值将自动分配给全局变量$ _,摧毁一切之前在那里。

+1

+1 for -MO = Deparse! – Richard 2012-03-27 12:31:31