Хеш может делать то, что вы хотите:
#!/usr/bin/perl
use strict;
use warnings;
my $s = "The+quick+brown+fox+jumps+over+the+lazy+dog+that+is+my+dog";
my %replace = (
"+" => " ",
dog => "cat",
);
$s =~ s/([+]|dog)/$replace{$1}/g;
print "$s\n";
В комментариях я вижу, что вы обеспокоены производительностью, решение для двух регулярных выражений является более производительным. Это потому, что любое решение, которое работает для одного регулярного выражения, должно будет использовать захваты (которые замедляют регулярное выражение).
Вот результаты теста:
eval: The quick brown fox jumps over the lazy cat that is my cat
hash: The quick brown fox jumps over the lazy cat that is my cat
two: The quick brown fox jumps over the lazy cat that is my cat
Rate hash eval two
hash 33184/s -- -29% -80%
eval 46419/s 40% -- -72%
two 165414/s 398% 256% --
Я использовал следующий тест:
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;
my $s = "The+quick+brown+fox+jumps+over+the+lazy+dog+that+is+my+dog";
my %replace = (
"+" => " ",
dog => "cat",
);
my %subs = (
hash => sub {
(my $t = $s) =~ s/([+]|dog)/$replace{$1}/g;
return $t;
},
two => sub {
(my $t = $s) =~ s/[+]/ /g;
$t =~ s/dog/cat/g;
return $t;
},
eval => sub {
(my $t = $s) =~ s/(\+)|(dog)/$1 ? ' ' : 'cat'/eg;
return $t;
},
);
for my $k (sort keys %subs) {
print "$k: ", $subs{$k}(), "\n";
}
Benchmark::cmpthese -1, \%subs;