“替换所有内容”完全等于“分配新值”。因此,当简单匹配就足够了时,您不需要替换运算符 ('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 正则表达式。