2016-12-20 4 views
5

Ich versuche, eine Zeichenfolge entweder Groß-und Kleinschreibung oder Groß-und Kleinschreibung nicht übereinstimmen. Gibt es eine Möglichkeit, die .match Methode Adverbien als Variablen zu nehmen?perl6 Wie verwendet man Adverbien als Variablen?

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

Mit $anAdverb innerhalb der Regex funktioniert nicht. Gibt es einen Workaround?

Antwort

4

Im Ausdruckskontext (d. H. Außerhalb von Argumentlisten) erzeugt :foo ein Objekt Pair.
Dieses Objekt kann dann als Adverb in eine Argumentliste interpoliert werden, mit |:

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

Leider ist die .match Methode nicht den :i Adverb unterstützt. (Wahrscheinlich ein Versehen - vielleicht einen Rakudo-Fehlerbericht öffnen.)

Ich glaube nicht, dass es eine Möglichkeit gibt, ein Adverb in eine Regex zu interpolieren.

Sie könnten Ihre regex als String speichern und verwenden <$foo> Syntax es zur Laufzeit in einem von zwei verschiedenen „Wrapper“ Regexes eval (eins mit :i, und eine ohne):

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>/); 

Dies ist jedoch unsicher, wenn vom Benutzer bereitgestellte Daten in die Regex gelangen.

Natürlich, wenn die ganze Regex paßt nur eine wörtliche String, gibt es keine Notwendigkeit für eval und Sie können den Teil in die Wrapper Regexes wie diese sicher zu interpolieren:

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

Vielen Dank für Ihre Hilfe SMLS! Ich überprüfe die Doc-Seite erneut auf Übereinstimmungsroutine, und es hat alle anderen Adverbien außer: i. https://docs.perl6.org/routine/match – lisprogtor

Verwandte Themen