最简单的方法是使用两个替换:
$string =~ s/A/123/g;
$string =~ s/B/456/g;
甚至(使用内联 for 循环作为对一个字符串应用多个替换的简写):
s/A/123/g, s/B/456/g for $string;
当然,对于更复杂的模式,这可能不会产生与一次完成两个替换相同的结果;特别是,如果模式可以重叠(如 A = YZ, B = XY),或者如果模式 B 可以匹配替换模式 A 的字符串,则可能会发生这种情况。
如果您希望一次性完成此操作,最通用的解决方案是使用/e modifier,这会导致替换被解释为 Perl 代码,如下所示:
$string =~ s/(A|B)/ $1 eq 'A' ? '123' : '456' /eg;
您甚至可以在替换中包含多个用分号分隔的表达式;最后一个表达式的值将被替换到字符串中。如果您这样做,您可能会发现使用paired delimiters 来提高可读性很有用,如下所示:
$string =~ s{(A|B)}{
my $foo = "";
$foo = '123' if $1 eq 'A';
$foo = '456' if $1 eq 'B';
$foo; # <-- this is what gets substituted for the pattern
}eg;
如果您的模式是常量字符串(如上面的简单示例),更有效的解决方案是使用查找哈希,如下所示:
my %map = ('A' => '123', 'B' => '456');
$string =~ s/(A|B)/$map{$1}/g;
使用此方法,您甚至不需要/e 修饰符(尽管对于这个特定示例,添加它不会有任何区别)。使用/e 的优势在于,与简单的哈希查找相比,它允许您实现更复杂的规则来选择替换。