首先,永远不要使用$&
变量:它会减慢正则表达式引擎的速度。另外,您不需要它;这相当于您当前的循环体:
s/apple/orange/i;
s/orange/apple/i;
但是,我们必须添加两点:
- 我们想替换所有出现的地方,而不仅仅是第一个匹配的单词。我们可以通过使用
/g
标志来实现这一点。
- 我们希望在一次替换中执行此操作,以便替换不会变回。
我们可以通过使用将匹配字符串映射到替换的哈希来做到这一点:
my %replacement = (
apple => 'orange',
orange => 'apple',
);
while (<>) {
s/(apple|orange)/$replacement{lc $1}/ig;
print;
}
lc
小写匹配的字符串;这是必要的,因此Apple
将被替换为orange
. 保留大小写(以便我们得到Orange
)可以通过删除不区分大小写的匹配并将 and 添加Orange
到Apple
替换散列来实现。
现在,如果您的哈希有大量替换,我们不想手动编写正则表达式(只是很多静态替代)。我们可以从哈希中创建一个正确的正则表达式,例如
my $re = join '|', map quotemeta, keys %replacement;
while (<>) {
s/($re)/$replacement{$1}/g;
}
转义特殊字符,quotemeta
以便您可以逐字匹配任意字符串。