2010-02-24 11 views
5

$ i = 1; जबकि ($ i < 3) { प्रिंट < < "ईओटी"; डीफ़ पीएक्स $ i = नया ई (उपयोगकर्ता) अगर (! पीएक्स $ i.hasErrors()) { println "$ {px $ i.name}/$ {px $ i.empr.to} ठीक है" }मैं पर्ल स्ट्रिंग में कोड जैसी चीज़ों से कैसे बच सकता हूं?

Can't call method "px" without a package or object reference at borrar.pl line 3.

मैं कैसे "पलायन" कर सकते हैं यदि:

EOT 

    $i++; 
} 

त्रुटि पैदा करता है?

धन्यवाद।

+0

मुझे नहीं पता कि यह क्या है, लेकिन यह निश्चित रूप से पर्ल नहीं है। – friedo

+0

प्रिंट/ईओटी के अंदर कोड निश्चित नहीं है, लेकिन यह बात नहीं है, मुझे केवल प्रिंट/ईओटी के अंदर क्या है जो stdout पर लिखा जाना चाहिए; वास्तव में अगर मैं "अगर" ब्लॉक को हटा देता हूं, तो यह पूरी तरह से चलता है। – xain

+0

दोह - मुझे इस तथ्य को याद आया कि सामान एक बड़े हेरेडोक में था। – friedo

उत्तर

6

यह कहना मुश्किल है कि यह कोड क्या पूरा करना है, लेकिन शायद आप अंतिम आउटपुट में संरक्षित होने के लिए प्रिंटल कथन में बाहरी डॉलर के संकेत चाहते हैं?

println "\${px$i.name}/\${px$i.empr.to} OK" 

कि परिवर्तन के साथ, त्रुटि मुक्त उत्पादन मैं देख रहा हूँ है:

def px1 = new E(user) 
if (!px1.hasErrors()) { 
     println "${px1.name}/${px1.empr.to} OK" 
} 

def px2 = new E(user) 
if (!px2.hasErrors()) { 
     println "${px2.name}/${px2.empr.to} OK" 
} 
+0

कोड एक बड़ी स्क्रिप्ट का हिस्सा है जो एक सीवी लोड करता है और अपने डेटा से ग्रोवी कक्षाएं बनाता है।सवाल यह है कि क्यों पर्ल कंपाइलर प्रिंट/ईओटी के अंदर ब्लॉक को संकलित करने की कोशिश कर रहा है और इसे कैसे बताना है। (बीटीडब्ल्यू, सिफारिश के लिए धन्यवाद लेकिन यह काम नहीं करता) – xain

+0

@xain: आपका क्या मतलब है "यह काम नहीं किया"? सटीक आउटपुट दिखाएं जो आप प्राप्त करने की उम्मीद करते हैं। शॉन के आउटपुट से यह अलग कैसे है? – toolic

+0

शॉन, मेरी गलती। यह ठीक काम किया। धन्यवाद! – xain

1

इस समस्या को ठीक करना चाहिए।

println "${"px$i.name"}/${"px$i.empr.to"} OK" 
println "px$i.name"/px$i.empr.to OK" 
1

जैसा कि आपने देखा है, $px स्ट्रिंग का हिस्सा मूल्यांकन किया जा रहा है। आप बस इसे से बचने के लिए की जरूरत है:

$i=1; 
while($i<3) { 
    print << "EOT"; 
    def px$i = new E(user) 
    if (!px$i.hasErrors()) { 
      println "\${px$i.name}/\${px$i.empr.to} OK" 
    } 

EOT 

    $i++; 
} 

के तहत "पार्स की Gory विवरण उद्धृत निर्माणों" perldoc perlop पर भागने स्ट्रिंग बारे में अधिक पढ़ें।

4

कमांड लाइन विकल्प -MO=Deparse आपको दिखाता है कि कैसे पर्ल ने इसे सरल बनाने के बाद अपना कोड व्याख्या किया है (उदा। हेडॉक्स को qq {} ब्लॉक में परिवर्तित करना)। जैसे

$ perl -MO=Deparse test.pl 
$i = 1; 
while ($i < 3) { 
    print qq[ def px$i = new E(user) \n if (!px$i.hasErrors()) {\n   println "${$i->px . 'name';}/${$i->px . 'empr' . 'to';} OK"\n }\n\n]; 
    ++$i; 
} 

प्रासंगिक हिस्सा है:

println "${$i->px . 'name';}/${$i->px . 'empr' . 'to';} 

पर्ल ${$i->px . 'name'} करने के लिए ${px$i.name} परिवर्तित कर दिया है!

पर्ल में, ${...} का मूल्यांकन जो कुछ भी ब्लॉक के अंदर है, और फिर भिन्नता यह इसे चालू करने के एक अदिश में वापस एक symbolic reference (अर्थात एक चर नाम) या एक अदिश संदर्भ के रूप में व्यवहार करते हैं, का मतलब है। तो पर्ल उन ब्लॉकों के अंदर जो कुछ भी है, उसे निष्पादित करने का प्रयास करता है, पर्ल कोड के रूप में उनकी सामग्री का इलाज करता है। ऐसा इसलिए है क्योंकि आपका हेरेडोक, "EOT" एक डबल-उद्धृत स्ट्रिंग की तरह है, और डॉलर के संकेतों को इंटरपोल करता है।

समाधान है: अपने डॉलर के संकेतों से बचें ($ ->\$) या हेड्रॉक्स की बजाय सिंगल कोट्स और कॉन्सटेनेशन का उपयोग करें।

1
my $format = << 'EOT'; 
def px%d = new E(user) 
    if (!px%d.hasErrors()) { 
      println "${px%d.name}/${px%d.empr.to} OK" 
    } 
EOT 

for my $i (1 .. 3) { 
    printf $format, ($i) x 4; 
} 
+1

(+1) कई प्रकार के हेरेडॉक्स सिंगल-कोट्स गैर-इंटरपोलेटेड हैं। एक और प्रकार बैकटिक्स है, उदा। 'ईओटी' जो शेल के माध्यम से स्ट्रिंग निष्पादित करेगा। – harschware

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