Naprawdę nie możesz zrobić tego, co chcesz, ponieważ funkcja podstawiania zwraca albo 1
jeśli zadziałał lub pusty ciąg znaków, jeśli nie działał. Oznacza to, że jeśli to zrobił:
doStuff($foo =~ s/regex/replacement/);
Funkcja doStuff
byłyby stosując albo 1
lub pusty łańcuch jako parametr. Nie ma powodu, dla którego funkcja substytucji nie mogłaby zwrócić wynikowego łańcucha zamiast tylko 1
, gdyby zadziałał. Była to jednak decyzja projektowa od najwcześniejszych dni Perla. W przeciwnym razie, co by się z tym stało?
$foo = "widget";
if ($foo =~ s/red/blue/) {
print "We only sell blue stuff and not red stuff!\n";
}
Wynikowy ciąg nadal jest widget
, ale podstawienie faktycznie nie powiodło się. Jeśli jednak podstawienie zwróci wynikowy ciąg znaków, a nie pusty ciąg znaków, wartość if
będzie nadal prawdziwa.
Następnie, należy rozważyć tę sprawę:
$bar = "FOO!";
if ($bar =~ s/FOO!//) {
print "Fixed up \'\$bar\'!\n";
}
$bar
jest teraz pusty. Jeśli podstawienie zwróci wynik, zwróci pusty ciąg znaków. Jednak zastąpienie faktycznie się udało i chcę, aby moja if
była prawdziwa.
W większości języków, funkcja podstawienie zwraca wynikowy ciąg znaków, a trzeba by zrobić coś takiego:
if ($bar != replace("$bar", "/FOO!//")) {
print "Fixed up \'\$bar''!\n";
}
tak, to z powodu decyzji projektowej Perl (zasadniczo lepiej naśladować składnia awk
) nie ma łatwego sposobu robienia tego, co chcesz.Jednak można to zrobić w ten sposób:
($foo = $bar) =~ s/regex/replacement/;
doStuff($foo);
To byłoby zrobić w ustawieniach miejsce $foo
bez uprzedniego przypisując mu wartość $bar
. $bar
pozostanie niezmieniony.
Dupes http://stackoverflow.com/questions/3321400/how-to-do-perl-inline-regex-without-setting-to-a- zmienna – daxim