Un hachage peut faire ce que vous voulez:
#!/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";
Dans les commentaires, je vois que vous êtes préoccupé par la performance, la solution à deux regex est plus performante. C'est parce que toute solution qui fonctionne pour une regex devra utiliser des captures (qui ralentissent l'expression rationnelle).
Voici les résultats d'une référence:
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% --
J'ai utilisé la référence suivante:
#!/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;
Cela ne simplifierait-il pas l'utilisation de deux substitutions d'expressions régulières distinctes? – WhirlWind
Voulez-vous s'il vous plaît poser la vraie question? – codeholic
Si vous recherchez des performances, vous devriez avoir demandé dans votre question, mais la façon d'obtenir des performances pourrait être de le faire entièrement sans expressions régulières. Avez-vous essayé tr, par exemple? – WhirlWind