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:
$ perl -wE'
for my $re (qw/ foo bar /) {
my $string = "test foo";
$string =~ s/$re/replaced/;
say $string;
}'
test replaced
test foo
mit /o:
$ 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")
$ perl -wE'
$x = "()";
say "\Qtest:";
say "\Q$x";'
test\:
\(\)
Last edited: 2012-04-08 16:11:47 +0200 (CEST)