Ich habe eine find_replace Subroutine, die Parameter (Inhalt, find regex, ersetzen regex, Ergebnisvariable zum Speichern von Ergebnis). Ich benutze qr//
, um sowohl den Regex zu finden als auch zu ersetzen. Find Regex funktioniert gut, aber die Replace Regex nicht.Verwenden Sie qr // zum Ersetzen von RegEx zu Unterroutine
$text = "11 22 33 44 55";
find_replace($text,qr/(33)(.*?)(55)/,qr/$1<BOLD>$2<\/BOLD>$3/,my $newText);
print $newText;
#Should print: 11 22 <I>33 <B>44</B> 55</I>
#But it prints: 11 22 <I>(?^:<B></B>)</I>
sub find_replace {
my $content = shift;
my $findRegEx = shift;
my $replaceRegEx = shift;
my $newVariable = \shift;
${$newVariable} = $content;
${$newVariable} =~ s/$findRegEx/<I>$replaceRegEx<\/I>/g;
}
Ich habe eine Lösung für dieses gefunden zu arbeiten:
$text = "11 22 33 44 55";
find_replace($text,qr/(33)(.*?)(55)/,sub{"$1<B>$2<\/B>$3"},my $newText);
print $newText;
#Prints: 11 22 <I>33 <B>44</B> 55</I>
sub find_replace {
my $content = shift;
my $findRegEx = shift;
my $replaceRegEx = shift;
my $newVariable = \shift;
${$newVariable} = $content;
${$newVariable} =~ s($findRegEx){ "<I>".$replaceRegEx->()."<\/I>" }ge;
}
Aber dieses Update verwendet sub{"…"}
statt qr/…/
. Nach was ich suche, ist, den qr//
für das Übergeben des Ersatzregex weiter zu verwenden und das gleiche Ergebnis zu erhalten.
Das Ersatzteil * ist kein Regex *. Versuche nicht, es zu einem zu machen. Der sub {} Weg ist der richtige Weg dies zu tun. – ysth
Sehen Sie [diesen Beitrag] (http://stackoverflow.com/a/41280344/4653379) (zum Beispiel) für welche Arten von Dingen, die Sie tun müssen. Verwenden Sie den "sub" -Ansatz, den Sie entdeckt haben, das ist eine nette Art, mit regex zu arbeiten :) – zdim
@zdim Dieser Code könnte durch die Verwendung von ['Data :: Munge :: replace'] (https://metacpan.org/pod/Data :: Munge # ersetzen-STRING, -REGEX, -REPLACEMENT, -FLAG). – melpomene