Ich habe eine Liste von Mustern, die ich in einer Zeichenfolge suchen möchte. Diese Muster sind zahlreich und enthalten zahlreiche Metazeichen, die ich nur wörtlich zuordnen möchte. Dies ist also die perfekte Anwendung für Metaquoting mit \Q..\E
. Die Komplikation besteht darin, dass ich der Variablenliste von Mustern einen regulären Ausdruck zuordnen muss.Metaquoting Muster in einer Variablenliste
use strict;
use warnings;
# sample string to represent my problem
my $string = "{{a|!}} Abra\n{{b|!!}} {{b}} Hocus {{s|?}} Kedabra\n{{b|+?}} {{b|??}} Pocus\n {{s|?}}Alakazam\n";
# sample patterns to look for
my @patterns = qw({{a|!}} {{s|?}} {{s|+?}} {{b|?}});
# since these patterns can be anything, I join the resulting array into a variable-length regex
my $regex = join("|",@patterns);
my @matched = $string =~ /$regex(\s\w+\s)/; # Error in matching regex due to unquoted metacharacters
print join("", @matched); # intended result: Hocus\n Pocus\n
Als ich metaquoting in den Verbindungsvorgang einzuführen versuchen, scheinen sie keine Wirkung zu haben.
Aus irgendeinem Grund hat das Metaquoting keine Auswirkungen, wenn es in der Zeichenfolge enthalten ist, die ich als regulären Ausdruck verwende. Für mich funktionieren sie nur, wenn sie direkt zu einer Regex wie in /\Q$anexpression\E/
hinzugefügt werden, aber soweit ich sagen kann, ist dies keine Option für mich. Wie komme ich hier zurecht?