2012-03-27 46 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; 
} 

Tôi đã mong đợi vòng lặp này để đọc từng dòng của tệp cho đến khi giá trị ngày giờ đầu tiên được đọc.

Thay vào đó, $ _ được đơn lẻ hóa và tôi nhận được tải về các giá trị "uninitialized value $ _ in pattern match" (và in).

Bất kỳ ý tưởng nào tại sao điều này xảy ra?

Một

+0

ActiveState perl v5.14.1 – Richard

Trả lời

20

$_ chỉ được thiết lập nếu bạn sử dụng các hình thức hình thức while (<$fh>), mà bạn thì không.

Nhìn này:

$ 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 

Từ perlop tài liệu:

Thông thường bạn phải gán giá trị trả về một biến, nhưng có một tình huống mà một bài tập tự động xảy ra. Nếu và chỉ khi ký hiệu đầu vào là điều duy nhất bên trong câu lệnh có điều kiện (ngay cả khi được cải trang thành vòng for (;;)), giá trị được tự động gán cho biến toàn cầu $ _, hủy bất kỳ thứ gì đã có trước đó.

+1

+1 for -MO = Deparse! – Richard

Các vấn đề liên quan