你真的不能做你想做的事情,因为如果替换函数有效则返回 a 1
,如果无效则返回空字符串。这意味着如果你这样做:
doStuff($foo =~ s/regex/replacement/);
该doStuff
函数将使用一个1
或一个空字符串作为参数。替换函数没有理由不能返回结果字符串,而不仅仅是一个1
if 它工作。然而,这是 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
将保持不变。