2016-12-20 13 views
5

मैं किसी स्ट्रिंग से केस-संवेदी या केस-असंवेदनशील मिलान करने की कोशिश कर रहा हूं। क्या .match विधि को चर के रूप में क्रियाएं करने का कोई तरीका है?perl6 चर के रूप में क्रियाओं का उपयोग कैसे करें?

my $aString = "foo bar baz"; 
my @anArray = <OO AR AZ>; 
my $anAdverb = :i; 
my $firstCheck = ($aString.match(/$anAdverb "@anArray[0]" /)).Bool; 

$anAdverb का उपयोग करते हुए अंदर regex काम नहीं करता। क्या आसपास कोई काम है?

उत्तर

4

अभिव्यक्ति संदर्भ में (यानी तर्क सूची के बाहर), :fooPair ऑब्जेक्ट बनाता है।
यह वस्तु में एक तर्क सूची में एक क्रिया विशेषण के रूप में अंतर्वेशित जा सकता है, | का उपयोग कर:

my $adverb = :g; 
say "a 1 b 2".match(/\d/, |$adverb); 

दुर्भाग्य से, .match विधि :i क्रिया विशेषण का समर्थन नहीं करता। (तर्कसंगत रूप से एक निरीक्षण - शायद एक राकुडो बग रिपोर्ट खोलें।)

मुझे नहीं लगता कि को एक regex में एक विज्ञापन को इंटरपोल करने का कोई तरीका है।

आप एक स्ट्रिंग के रूप में अपने रेगुलर एक्सप्रेशन से संग्रहीत कर सकती है, और और रनटाइम पर यह eval करने के लिए दो अलग-अलग "आवरण" regexes (:i के साथ एक और वे इसके बिना) में से एक में <$foo> सिंटैक्स का उपयोग करें:

use MONKEY-SEE-NO-EVAL; 

my $string = "foo bar baz"; 
my @array = <OO AR AZ>; 
my $case-sensitive = True; 
my $regex = ' "@array[0]" '; 

say ?$string.match($case-sensitive ?? /:i <$regex>/ !! /<$regex>/); 

हालांकि, यह असुरक्षित है यदि कोई उपयोगकर्ता द्वारा प्रदत्त डेटा regex में समाप्त होता है।

बेशक

, अगर पूरी regex सिर्फ एक शाब्दिक स्ट्रिंग से मेल खाता है, वहाँ eval की आवश्यकता नहीं है और आप सुरक्षित रूप से इस तरह आवरण regexes में सबस्ट्रिंग को जोड़ सकते हैं:

my $string = "foo bar baz"; 
my @array = <OO AR AZ>; 
my $case-sensitive = True; 
my $substring = @array[0]; 

say ?$string.match($case-sensitive ?? /:i $substring/ !! /$substring/); 
+2

आप आपकी मदद के लिए SMLS धन्यवाद! मैं फिर से मिलान दिनचर्या के लिए दस्तावेज़ पृष्ठ की जांच करता हूं, और इसमें अन्य सभी क्रियाएं हैं: i। https://docs.perl6.org/routine/match – lisprogtor

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