2013-06-07 6 views
5

मैं निम्नलिखित चेतावनी मिलती है:अजीब बात

"सेल्सियस पर संयोजन या स्ट्रिंग में अप्रारंभीकृत मूल्य का उपयोग (।): \ उपकरण \ test.pl लाइन 17, डेटा लाइन 1."

लेकिन __DATA__ की अगली पंक्ति बिना किसी चेतावनी के कार्रवाई की जाएगी और इन मिलती है:

test1b.txt: परीक्षण test1c.txt: परीक्षण: परीक्षण

अधिक अजीब बात है कि जब मैं एक पंक्ति जोड़ें: print "$line:".$'."\n"; चेतावनी गायब हो गया।

किसी कुछ सुराग है?

#!/usr/bin/perl -w 
use strict; 
my $pattern='test'; 
my $output='$&'; 
while(<DATA>) 
{ 
    chomp; 
    my $line=$_; 
    chomp($line); 
    $line=~/$pattern/; 
    #print "$line:".$&."\n"; #why uncommenting this line make the following line pass without no warning. 
    my $result="$line:".eval($output)."\n"; 
    print $result; 
} 

__DATA__ 
test1a.txt 
test1b.txt 
test1c.txt 

उत्तर

10

पर्ल समझता है $&, $', और $` महंगा हो सकता है, तो यह वास्तव में एक प्रोग्राम है जो उन्हें का उपयोग नहीं करता में उन्हें पॉप्युलेट नहीं होंगे। perlvar मैनपेज से:

इस चर [$&] के उपयोग के एक कार्यक्रम में कहीं भी एक काफी प्रदर्शन दंड पर सभी नियमित अभिव्यक्ति से मेल खाता है लगाता है। इस दंड से बचने के लिए, आपको @- उपयोग करके एक ही सबस्ट्रिंग निकाल सकते हैं। Perl 5.10 के साथ से, आप विशेष मैच के संचालन के लिए एक ही बात करने के लिए /p मैच झंडा और ${^MATCH} चर का उपयोग कर सकते हैं।

हालांकि

, जब आप केवल उन्हें एक स्ट्रिंग है कि आप eval को पारित अंदर का उपयोग, पर्ल है कि आप उन्हें प्रयोग कर रहे हैं नहीं बता सकता, तो यह उन्हें पॉप्युलेट नहीं होंगे, तो वे अपरिभाषित हो जाएगा ।

+0

अच्छा बिंदु! मैं rarelly 'eval' का उपयोग करें। कुछ लिंक इस तरह के http://stackoverflow.com/questions/10909127/perl-why-doesnt-eval-set-1, के रूप में इसके उपयोग के बारे में अधिक धारणा, दे। – user2462304

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