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