2014-04-14 8 views
8

में definedness के लिए परीक्षण जब एक चर निर्दिष्ट और पर्ल में एक ऑपरेशन में definedness के लिए यह परीक्षण करने के लिए कोशिश कर रहा है, एक if की हालत में उदाहरण के लिए उपयोगी होगा के रूप में, यह स्वाभाविक मेरे लिए करने के लिए प्रतीत होता है लिखें:समझौता पूर्वता जब बताए और पर्ल

if (defined my $thing = $object->get_thing) { 
    $thing->do_something; 
} 

जहां तक ​​मेरी समझ जाता है, defined एक rightward list operator, जो काम की तुलना में कम है की पूर्वता है, इसलिए मैं ऊपर मेरी कोड के बराबर होने की अपेक्षा करेंगे:

if (defined (my $thing = $object->get_thing)) { 
    $thing->do_something; 
} 

जबकि उत्तरार्द्ध, संश्लेषित कोड काम करता है, पूर्व में निम्नलिखित घातक त्रुटि उत्पन्न होती है: "स्केलर असाइनमेंट में परिभाषित ऑपरेटर को संशोधित नहीं किया जा सकता"।

यह ब्रांड्स जोड़ने के लिए एक बड़ा सौदा नहीं है, लेकिन मुझे समझना अच्छा लगेगा कि पहला संस्करण क्यों काम नहीं करता है, उदा। किस तरह की "चीज़" defined है और इसकी प्राथमिकता क्या है?

उत्तर

10

नाम ऑपरेटरों एकल ऑपरेटरों (ऑपरेटरों कि हमेशा ठीक एक संकार्य लेने के लिए) और सूची ऑपरेटरों (सब कुछ किसी और) [1] में विभाजित हैं।

defined और my[2]एकल ऑपरेटरों है, जो अन्य नामित ऑपरेटरों की तुलना में अधिक पूर्वता हैं।

वही सब के लिए जाता है, इसलिए मैं उन्हें प्रदर्शित करने के लिए उपयोग करूंगा।

$ perl -MO=Deparse,-p -e'sub f :lvalue {} sub g :lvalue {} f g $x = 123;' 
sub f : lvalue { } 
sub g : lvalue { } 
f(g(($x = 123))); 
-e syntax OK 

$ perl -MO=Deparse,-p -e'sub f($) :lvalue {} sub g($) :lvalue {} f g $x = 123;' 
sub f ($) : lvalue { } 
sub g ($) : lvalue { } 
(f(g($x)) = 123); 
-e syntax OK 

लेकिन निश्चित रूप से, defined तो एक त्रुटि में एक काम परिणामों की एलएचएस पर यह लग रहा है, एक lvalue कार्य नहीं है।


  1. and, or, not, xor, lt, le, gt, ge, eq, ne और cmp नहीं माना जाता है नामित ऑपरेटरों।

  2. my बहुत असामान्य है। एक संकलन-समय और रन-टाइम प्रभाव दोनों होने के अलावा, इसका वाक्यविन्यास इस बात पर निर्भर करता है कि क्या माता-पिता का तर्क इसके तर्क के आसपास किया जाता है या नहीं। माता-पिता के बिना, यह एक यूनरी ऑपरेटर है। माता-पिता के साथ, यह एक सूची ऑपरेटर है।

+0

क्या आप जानते हैं कि 'निर्धारित' की असाइनमेंट की तुलना में अधिक प्राथमिकता क्या है? उदाहरण के लिए, 'मेरा $ test =' test 'प्रिंट प्रिंट करें "परीक्षण" प्रिंट करता है। – scozy

+0

मैंने अपना जवाब अपडेट किया है। – ikegami

+0

@scozy: प्राथमिकता के साथ ऑपरेटर के रूप में 'मेरा' के बारे में मत सोचो। कीवर्ड 'मेरा' एक विशेष पार्सिंग प्रेरित करता है। – gensym

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