कमांड लाइन विकल्प -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"
एक डबल-उद्धृत स्ट्रिंग की तरह है, और डॉलर के संकेतों को इंटरपोल करता है।
समाधान है: अपने डॉलर के संकेतों से बचें ($
->\$
) या हेड्रॉक्स की बजाय सिंगल कोट्स और कॉन्सटेनेशन का उपयोग करें।
मुझे नहीं पता कि यह क्या है, लेकिन यह निश्चित रूप से पर्ल नहीं है। – friedo
प्रिंट/ईओटी के अंदर कोड निश्चित नहीं है, लेकिन यह बात नहीं है, मुझे केवल प्रिंट/ईओटी के अंदर क्या है जो stdout पर लिखा जाना चाहिए; वास्तव में अगर मैं "अगर" ब्लॉक को हटा देता हूं, तो यह पूरी तरह से चलता है। – xain
दोह - मुझे इस तथ्य को याद आया कि सामान एक बड़े हेरेडोक में था। – friedo