Regex में $ / और ¢ के बीच क्या अंतर है?


11

जैसा कि शीर्षक इंगित करता है, क्या $/और किसके बीच अंतर है ? वे हमेशा एक ही मूल्य के दिखाई देते हैं:

my $text = "Hello world";

$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;

दोनों समान मूल्यों के साथ मैच ऑब्जेक्ट में परिणाम करते हैं। एक के बाद एक का उपयोग करने में क्या तर्क है?

जवाबों:


11

चर $/सबसे हाल के मैच को संदर्भित करता है जबकि चर सबसे हाल के सबसे बाहरी मैच को संदर्भित करता है। उपर्युक्त की तरह अधिकांश मूल रीजैक्स में, यह एक और एक ही हो सकता है। लेकिन जैसा कि .rakuविधि के आउटपुट से देखा जा सकता है , Matchवस्तुओं में अन्य Matchऑब्जेक्ट शामिल हो सकते हैं (यह वही है जो आपको तब मिलता है जब आप उपयोग करते हैं $<foo>या $1कैप्चर के लिए)।

मान लीजिए कि इसके बजाय हमारे पास मात्रात्मक कैप्चर के साथ निम्नलिखित रेगेक्स है

/ ab (cd { say $¢.from, " ", $¢.to } ) + /

और अगर यह "abcdcdcd" से मिलान करता है, तो यह निम्न आउटपुट को देखेगा:

0 2
0 4
0 6

लेकिन अगर हम उपयोग करने से बदलते हैं $/, तो हमें एक अलग परिणाम मिलता है:

2 2
4 4
6 6

(कारण .toथोड़ा-सा बंद प्रतीत होता है कि यह है - और .pos- कैप्चर ब्लॉक के अंत तक अपडेट नहीं किया गया है।)

दूसरे शब्दों में, होगा हमेशा क्या अपने अंतिम मैच वस्तु (यानी, हो जाएगा का उल्लेख $final = $text ~~ $regexके रूप में आप के बाद ऊपर के उदाहरण में समाप्त होने हैं पूरा मैच तो ताकि आप वास्तव में regex का एक जटिल कब्जा पेड़ के अंदर पार कर सकते हैं), तो आप सिर्फ सकता है ऐसा $¢[0]पहला मैच, का उल्लेख करने के $¢[1]दूसरे, आदि

रेगेक्स कोड ब्लॉक के अंदर, $/सबसे तात्कालिक मैच को संदर्भित करेगा। उपरोक्त मामले में, यह अंदर के लिए मैच है ( )और अन्य मैचों के बारे में नहीं पता होगा, न ही मिलान की मूल शुरुआत: ( )ब्लॉक के लिए बस शुरुआत । इसलिए अधिक जटिल रेगेक्स दें:

/ a $<foo>=(b $<bar>=(c)+ )+ d /

हम किसी भी बिंदु पर $ $ fooटोकन का उपयोग करके किसी भी बिंदु पर पहुंच सकते हैं $¢<foo>। हम उपयोग करके barदिए गए टोकन को एक्सेस कर सकते हैं । यदि हम कैप्चर के अंदर एक कोड ब्लॉक डालते हैं, तो यह टोकन का उपयोग करके या , लेकिन यह अन्य एस तक पहुंचने में सक्षम नहीं होगा ।foo$¢<foo>[0]<bar>foobar$<bar>$/<bar>foo


1
ओह! मैंने डॉक्टर के "मुख्य अंतर $/और गुंजाइश है के बीच की व्याख्या की : उत्तरार्द्ध में केवल रेगेक्स के अंदर एक मूल्य है" का मतलब केवल एक वैस्टर्नियल ट्रेस था, जैसा कि Cursorहै। जब मैं आपका उत्तर पढ़ता हूं तो मुझे लगता है कि क्या $*TOPमैं संभावित सुधार में बना होगा? SO को मेरे उत्तर की धारा "क्यों / कैसे एक अतिरिक्त चर कैप्चर समूहों के साथ दोहराया मध्यस्थ चरित्र में मिलान की जरूरत है?"। लेकिन मेरे प्रयास को बदलने के लिए $*TOPसाथ में विफल रहा है। क्या आपको उस उत्तर में मेरी बात समझ में आई? क्या आप इसे काम कर सकते हैं?
रायफल

Raiph: तो व्याकरण में, प्रत्येक टोकन के लिए नवीनीकृत किया जाता है, इसलिए आपको टोकन $*TOP := $¢में कहना होगा , TOPलेकिन इससे निश्चित रूप से संस्करण की आवश्यकता से छुटकारा नहीं मिलता है $*TOP। मैं मानता हूं कि शीर्ष स्तर पर मैचों का उल्लेख करने में सक्षम होना भयानक होगा। समस्या यह है कि आखिरकार, अभी भी आप जिसे पहचानते हैं: जब स्थिति / हैश मैच ऑब्जेक्ट पर पोस्ट करता है। उपयोग करते समय - जो कि प्रति टोकन है - जैसे ही इसके संलग्न { }ब्लॉक का सामना होता है, परिभाषा के अनुसार परिणाम प्राप्त होंगे ।
user0721090601

मेरे लिए दिलचस्प बात यह है कि विकसित होने में Binex, मैंने यह नहीं पाया कि उनका मुकाबला करने के तुरंत बाद मैच के नतीजों को किसी भी तरह से खराब कर दिया जाए। दिन के अंत में, आप या तो कैश्ड सूची / हैश पर पॉपिंग कर रहे हैं या आप मैच की सूची / हैश पर / पॉपिंग कर रहे हैं। हालाँकि, कुछ प्रकार की आंतरिक गति हो सकती है, मुझे LTM के लिए उपयोग होने की जानकारी नहीं है, जो इसके मूल में होने की संभावना है ( { }LTM के प्रयोजनों के लिए एक टोकन को समाप्त करता है, और इसलिए दौड़ने / परीक्षण करने की अधिक संभावना है एक |समूह में टोकन के बाकी )
user0721090601

आह। मैं निष्कर्ष पर पहुंच गया था गतिशील था, और जब यह काम नहीं किया तो आश्चर्यचकित था। लेकिन पैसा अब गिरा है कि यह शाब्दिक है, जैसा कि मैंने अनुमान लगाया था कि "बाहरी शब्द" के आपके उपयोग को दिया जा सकता है, और जैसा कि आप समझाते हैं, प्रत्येक नियम की शुरुआत में स्थापित किया गया है।
रईफ

इसलिए, iiuc, एक नियम की शुरुआत में, एक नया मैच ऑब्जेक्ट बनाया जाता है जो मूल इनपुट स्ट्रिंग के भीतर मिलान इंजन की कर्सर स्थिति को रिकॉर्ड करता है, लेकिन अन्यथा खाली है। (सही?) इसके बाद और $/एक ही वस्तु है, अर्थात् इस नए मैच वस्तु है, जो कि इस नियम से मेल खाता है और कैप्चर रिकॉर्ड करेगा के रूप में यह प्रगति करने के लिए बाध्य कर रहे हैं। फिर, जैसे-जैसे प्रगति हो रही है, इस समग्र मैच ऑब्जेक्ट के लिए बाध्य रहता है, जबकि $/हर बार एक नया मैच ऑब्जेक्ट बनने पर रिबाउंड होता है, इसलिए यह हमेशा मेल खाता है, जैसा कि आप कहते हैं, नवीनतम मैच ऑब्जेक्ट के लिए। सही?
raiph
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.