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

एक्टिवस्टेट perl v5.14.1 – Richard

उत्तर

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 डॉक्स से:

आमतौर पर आप एक चर करने के लिए दिए गए मान असाइन करना होगा, लेकिन वहाँ एक स्थिति है जहाँ एक स्वचालित असाइनमेंट होता है। यदि और केवल इनपुट प्रतीक कुछ समय के सशर्त के अंदर केवल कुछ चीज (भले ही (;;) लूप के रूप में छिपा हुआ हो), मान स्वचालित रूप से वैश्विक चर $ _ को सौंपा गया है, जो कुछ भी नष्ट कर रहा है पहले वहाँ था

+1

+1 -एमओ = प्रस्थान के लिए +1! – Richard

संबंधित मुद्दे