2012-03-27 58 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