2017-10-28 20 views
5

मान लीजिए कि हमारे पास नियमित रूप से परिवर्तनीय पैटर्न है, जिसे सेगमेंट में विभाजित नहीं किया जा सकता है। जैसे यह infixation (शब्द के अंदर कुछ अक्षर जोड़ना) या स्वर परिवर्तन ('ablaut') हो सकता है। जर्मन से एक उदाहरण पर विचार करें।क्या मैं पर्ल 6 में एक शाब्दिक रेगेक्स संशोधित कर सकता हूं?

my @words = <Vater Garten Nagel>; 
my $search = "/@words.join('|')/".EVAL; 

"mein Vater" ~~ $search;        
say $/; # 「Vater」 

तीनों जर्मन शब्द उनके 2 पत्र 'एक' को 'ए' को बदलकर बहुवचन के रूप में। तो 'वाटर' → 'वाटर', 'गार्टन' → 'गार्टेन', 'नागेल' → 'नागेल'।

क्या मेरे $search रेगेक्स को संशोधित करने का कोई तरीका है ताकि यह बहुवचन रूपों से मेल खा सके? यहाँ मैं के लिए क्या देख रहा हूँ है:

my $search_ä = $search.mymethod; 
"ihre Väter" ~~ $search_ä; 
say $/; # 「Väter」 

बेशक, मैं एक नया regex में @words सरणी और 'precompile' इसे संशोधित कर सकते हैं। लेकिन मौजूदा regex को संशोधित करने के लिए यह बेहतर होगा (यदि संभव हो)।

+1

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

+0

@ ब्रैडगिलबर्ट, डिफ़ॉल्ट रूप से इस अनुकूलन का उपयोग करने के संभावित दोष क्या हैं (सामान्यतः, मैं सैकड़ों खोज कुंजी और विशाल टेक्स्ट कॉरपोरेशन के साथ काम करता हूं, इसलिए इस अनुकूलन के बिना यह वास्तव में धीमा है)? कोड कम लचीला और कम सुरुचिपूर्ण होने के अलावा। स्पष्टीकरण के लिए –

उत्तर

7

आप नहीं कर सकते।

रेगेक्स कोड 6 में कोड ऑब्जेक्ट्स हैं। इसलिए आपका प्रश्न मूल रूप से पढ़ता है "क्या मैं उन्हें लिखने के बाद सबराउटिन या विधियों को संशोधित कर सकता हूं?"। और जवाब पारंपरिक कोड ऑब्जेक्ट्स और रेगेक्स के लिए समान है: नहीं, उन्हें लिखें कि आप उन्हें पहले स्थान पर चाहते हैं।

उस ने कहा, आपको वास्तव में अपने उपयोग के मामले में EVAL की आवश्यकता नहीं है। आप एक regex के अंदर एक सरणी चर का उपयोग करते हैं, यह विकल्प शाखाओं की एक सूची के रूप में अंतर्वेशित है, तो आप सिर्फ लिख सकते हैं:

my @words = <Vater Garten Nagel>; my $search = /@words/;

regex $search एक बंद हो जाता है, तो आप, आप भी @words को संशोधित करता है, तो $search मैचों में बदलें।

इस विशिष्ट उदाहरण के लिए एक और दृष्टिकोण :ignoremark संशोधक, जो a बनाता है उपयोग करने के लिए भी ä से मेल होगा (यह भी हालांकि इस तरह के ā या ǎ के रूप में अन्य रूपों के बहुत सारे,।)

+1

धन्यवाद! मेरे/'शब्द /' के बजाय 'EVAL' का उपयोग करने के लिए, समस्या यह है कि वास्तविक डेटा के साथ मेरे '@ शब्द' खोज सरणी में आमतौर पर कई सैकड़ों कुंजी होती हैं। इसलिए यदि मैं उन्हें 'EVAL'' के साथ 'precompile' नहीं करता हूं, तो प्रोग्राम वास्तव में धीमा हो जाता है। मैंने इस समस्या के बारे में कई सवाल पूछे हैं, इसलिए यदि कोई बेहतर समाधान है, तो कृपया मुझे बताएं। ① [रेगेक्स गति] (https://stackoverflow.com/questions/46867216/regex-speed-in-perl-6) ② [एक सरणी फ़िल्टर करना] (https://stackoverflow.com/questions/46933838/filtering-elements के- एक सरणी-साथ-तत्वों के-एक और सरणी में पर्ल -6) –

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

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