Хэш может делать то, что вы хотите:
#!/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;
Не упростит ли это использование двух отдельных замещений регулярных выражений для этого? – WhirlWind
Не могли бы вы задать реальный вопрос? – codeholic
Если вы ищете производительность, вы должны спросить в своем вопросе, но способ получить производительность может состоять в том, чтобы сделать это полностью без регулярных выражений. Например, вы пытались tr? – WhirlWind