1
置換関数は、機能した場合はaを返し、機能しなかった場合は空の文字列を返すため、実際には必要なことを実行できません。つまり、これを行った場合:
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
でも、はtrueになります。
次に、このケースを考えてみましょう。
$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
変更されません。