Вы действительно не можете делать то, что хотите, потому что функция подстановки возвращает либо 1
, если она сработала, либо пустую строку, если она не сработала.Это означает, что если вы сделали это:
doStuff($foo =~ s/regex/replacement/);
Функция doStuff
будет использовать либо 1
, либо пустую строку в качестве параметра.Нет причины, по которой функция подстановки не смогла бы вернуть результирующую строку вместо 1
, если она работала.Тем не менее, это было дизайнерское решение с самых ранних дней Perl.Иначе, что случилось бы с этим?
$foo = "widget";
if ($foo =~ s/red/blue/) {
print "We only sell blue stuff and not red stuff!\n";
}
Результирующая строка по-прежнему widget
, но замена фактически не удалась.Однако, если подстановка вернула результирующую строку, а не пустую строку, if
все равно будет истинным.
Затем рассмотрим следующий случай:
$bar = "FOO!";
if ($bar =~ s/FOO!//) {
print "Fixed up \'\$bar\'!\n";
}
$bar
сейчаспустая строка.Если подстановка вернет результат, она вернет пустую строку.Тем не менее, подстановка действительно прошла успешно, и я хочу, чтобы мой if
был истинным.
В большинстве языков функция подстановки возвращает результирующую строку, и вам придется сделать что-то вроде этого:
if ($bar != replace("$bar", "/FOO!//")) {
print "Fixed up \'\$bar''!\n";
}
Таким образом, из-за решения по дизайну Perl (в основном для лучшего имитации синтаксиса awk
), нет простого способа сделать то, что вы хотите.Однако вы могли бы сделать это:
($foo = $bar) =~ s/regex/replacement/;
doStuff($foo);
Это установило бы на месте значение $foo
без предварительного присвоения ему значения $bar
.$bar
останется без изменений.