2011-05-25 8 views
12

मैं रूबी/Oniguruma में एक पक्ष प्रभाव है कि 4 में से 1 मालूम होता है बराबर बयान में ही मौजूद है ध्यान दिया है। क्यों चर day009 में परिभाषित किया गया है, लेकिन 003, 005 या 007 में नहीं?= ~ ऑपरेटर को कभी-कभी दुष्प्रभाव क्यों होते हैं?

irb(main):001:0> r = /(?<day>\d\d):(?<mon>\d\d)/ 
=> /(?<day>\d\d):(?<mon>\d\d)/ 

irb(main):002:0> r =~ "24:12" 
=> 0 
irb(main):003:0> day 
NameError: undefined local variable or method `day' 

irb(main):004:0> "24:12" =~ r 
=> 0 
irb(main):005:0> day 
NameError: undefined local variable or method `day' 


irb(main):006:0> "24:12" =~ /(?<day>\d\d):(?<mon>\d\d)/ 
=> 0 
irb(main):007:0> day 
NameError: undefined local variable or method `day' 


irb(main):008:0> /(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12" 
=> 0 
irb(main):009:0> day 
=> "24" 

एनबी # 1: यह सभी चार मामलों में एक ही रेगेक्स और एक ही स्ट्रिंग है।

nb # 2: मैं एमएस विंडोज और Ubuntu Linux में व्यवहार की पुष्टि कर लें।

+2

नोट: हालांकि इस मामले यहाँ नहीं है, तो आप सावधान जब आईआरबी में स्थानीय चर के साथ प्रयोग करना होना चाहिए। आईआरबी में कोड का मूल्यांकन करने के तरीके के कारण, वे एक स्क्रिप्ट की तुलना में आईआरबी में थोड़ा अलग व्यवहार कर सकते हैं। पुष्टि करने के लिए हमेशा स्क्रिप्ट लिखें। –

+0

अच्छा बिंदु, जोर्ग। –

उत्तर

13

जब आप फोन "24:12" =~ r आप वास्तव में "24:12".=~(r) कहते हैं। तो, String#=~ सिर्फ स्थिति मैच शुरू होता है, या नहीं के बराबर रिटर्न अगर वहाँ कोई मुकाबला नहीं है।

लेकिन जब आप फोन /(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12" आप वास्तव में Regexp#=~

फोन और जैसा कि प्रलेखन कहते हैं

तो = ~ एक regexp शाब्दिक नामित कैप्चर के साथ साथ प्रयोग किया जाता है, पर कब्जा कर लिया तार (या नहीं के बराबर) है कैप्चर नामों द्वारा नामित स्थानीय चर को असाइन किया गया।

003 के बारे में क्या:

अगर regexp एक शाब्दिक नहीं है काम नहीं होती है।

re = /(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/ 
    re =~ " x = y " 
    p lhs # undefined local variable 
    p rhs # undefined local variable 

और

काम नहीं होती है, तो regexp दाहिने हाथ की ओर पर रखा गया है।
"x = y" = ~ /(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/
पी एलएचएस, आरएचएस # अपरिभाषित स्थानीय चर

+0

धन्यवाद नैश। एक बहुत अच्छा जवाब। लेकिन क्या आप प्रश्न में '003' को भी समझा सकते हैं - यानी एक संकलित रेगेक्स (रेगेक्स शाब्दिक नहीं) को' = ~ 'संदेश प्राप्त होता है और यह स्थानीय चर निर्दिष्ट नहीं करता है। –

+0

आपका स्वागत है! अद्यतन देखें। –

+1

"कैप्चर किए गए तार असाइन किए गए हैं ...", "असाइनमेंट नहीं हुआ है ..."? अजीब व्याकरण ... –

1

मेरा मानना ​​है कि 003 समर्थित नहीं है क्योंकि इसके साथ उस बिंदु पर Rubyland में एक पूर्ण विकसित RegExp ऑब्जेक्ट है, संभवतः ओवरराइड विधियों और ऐसे। इससे असाइन किए गए स्थानीय लोगों का दायरा बहुत जटिल हो जाता है।

+0

धन्यवाद, जेम्स।रूबी रचनाकारों के इरादे के बारे में मेरा एक और विचार था, लेकिन शायद आप सही हैं कि यह एक तकनीकी मुद्दा है। –

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