「すべてを置き換える」は、「新しい値を割り当てる」とまったく同じです。したがって、単純な一致で十分な場合は、置換演算子 ('s///') は必要ありません。
my $var = 'This apple is white';
if ($var !~ /\bapple\b/i) {
$var = 'No apples for you!';
}
正規表現を少し変更しました:/i
修飾子を追加し、パターンの大文字と小文字を区別しないようにしました ('Apple' と 'apple' の両方をキャプチャするため; 元の投稿では 'pple' だったのはそのためだと思います)。\b
('Applegate' と 'pineapple' の一致を防ぐため)。
更新:それが最も明確な解決策だと思いますが、技術的には、なしで行うことも可能ですif
:
$var =~ s/^(?!.*\bapple\b.*).*$/No apples for you/i;
簡単なテストを次に示します。
use 5.010;
use warnings;
use strict;
my @fruit_strings = (
'This apple is white',
'This pineapple is violet',
'This Apple is a company',
'This pear is green');
for (@fruit_strings) {
s/^(?!.*\bapple\b.*).*$/No apples for you/i;
say;
}
文字列が複数行の場合/m
、正規表現に修飾子を追加する必要があることに注意してください。
また、Perl 正規表現のクイック スタートとPerl 正規表現の 2 つのチュートリアルを読むことをお勧めします。