Nun, hauptsächlich funktioniert es nicht als tr///d
hat nichts mit Ihrer Anfrage zu tun (tr/abc/12/d
ersetzt eine mit 1, b mit 2, und entfernt c). Außerdem interpolieren Arrays standardmäßig nicht in reguläre Ausdrücke auf eine Weise, die für Ihre Aufgabe nützlich ist. Ohne eine Hash-Abfrage oder einen Unterprogrammaufruf oder eine andere Logik können Sie auch keine Entscheidungen auf der rechten Seite einer s///
-Operation treffen.
Um die Frage im Titel zu beantworten, können Sie gleichzeitig mehr ersetzt ausführen - äh, in bequemer Nachfolge - auf diese Weise:
#! /usr/bin/env perl
use common::sense;
my $sentence = "hello world what a lovely day";
for ($sentence) {
s/what/it's/;
s/lovely/bad/
}
say $sentence;
wie etwas mehr zu tun, was Sie hier versuchen:
#! /usr/bin/env perl
use common::sense;
my $sentence = "hello world what a lovely day";
my %replace = (
what => "it's",
lovely => 'bad'
);
$sentence =~ s/(@{[join '|', map { quotemeta($_) } keys %replace]})/$replace{$1}/g;
say $sentence;
Wenn Sie eine Menge solcher Ersatz werde tun, 'kompilieren' die Regex zuerst:
my $matchkey = qr/@{[join '|', map { quotemeta($_) } keys %replace]}/;
...
$sentence =~ s/($matchkey)/$replace{$1}/g;
EDIT:
Und auf meiner Bemerkung über Array-Interpolation zu erweitern, können Sie $"
ändern:
local $" = '|';
$sentence =~ s/(@{[keys %replace]})/$replace{$1}/g;
# --> $sentence =~ s/(what|lovely)/$replace{$1}/g;
Welche Dinge hier nicht verbessern, wirklich, obwohl es kann, wenn Sie bereits die Schlüssel in einem haben Array:
local $" = '|';
$sentence =~ s/(@keys)/$replace{$1}/g;
Werden die Wörter immer ganze Wörter sein oder gibt es das Potenzial für Muster? – squiguy