Thread Variabler Regex mit komplizierten Zeichen (15 answers)
Opened by marky at 2012-04-08 13:42

pq
 2012-04-08 16:06
#157326 #157326
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
der modifier /e bewirkt, dass die rechte seite der substitution als code aufgerufen wird, nicht als string (nicht zu verwechseln mit einem "echten" eval).

eine substitution s/x/y/ bedeutet:
ersetze das, was auf die regex /x/ matcht, mit dem string "y"

s/x/$y/ bedeutet:
ersetze das, was auf die regex /x/ matcht, mit dem string "$y" (also dem inhalt von $y interpoliert)

s/x/funktion($y)/e bedeutet:
ersetze das, was auf die regex /x/ matcht, mit dem ergebnis funktion($y). der code wird also ausgeführt.

s/x/$y/e bedeutet:
ersetze das, was auf die regex /x/ matcht, mit $y (also der variable $y bzw ihrem inhalt).

so gesehen ist beim letzten beispiel das /e eine no-op, einmal steht $y in anführungszeichen, das andere mal nicht, das ist wie:
$x = $y;
vs.
$x = "$y";

(mal von sonderfällen wie string-overload von objekten abgesehen)

in keinem der fälle wird der inhalt der variable $y selbst interpretiert. (das würde erst bei einem doppelten /ee passieren, was dann nämlich tatsächlich ein eval() aufruft)



der modifier /o bewirkt, dass die regex auf der linken seite nur beim ersten mal kompiliert wird, auch wenn sich die variable ändert.
ohne /o:
Code: (dl )
1
2
3
4
5
6
7
8
$ perl -wE'
for my $re (qw/ foo bar /) {
my $string = "test foo";
$string =~ s/$re/replaced/;
say $string;
}'
test replaced
test foo

mit /o:
Code: (dl )
1
2
3
4
5
6
7
8
$ perl -wE'
for my $re (qw/ foo bar /) {
my $string = "test foo";
$string =~ s/$re/replaced/o;
say $string;
}'
test replaced
test replaced

beim zweiten durchlauf der schleife enthält $re zwar "bar", aber die regex wird nur einmal kompiliert und matcht daher auf "foo" vom ersten durchlauf.


\Q bewirkt, dass nachfolgende sonderzeichen escaped werden.
"\Qfoo bar $baz" ist dasselbe wie quotemeta("foo bar $baz")

Code: (dl )
1
2
3
4
5
6
$ perl -wE'
$x = "()";
say "\Qtest:";
say "\Q$x";'
test\:
\(\)

Last edited: 2012-04-08 16:11:47 +0200 (CEST)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread Variabler Regex mit komplizierten Zeichen