3 Stimmen

Substitution von Zeichen in Perl

Ich arbeite daran, alle Vokale in jedem Wort zu verdoppeln. Zum Beispiel:

$string="wenn es regnet, bedecke es mit einem Regenschirm";

Hier ist der Code, den ich geschrieben habe, aber ich erhalte nicht die richtige Ausgabe.

$string=~s/a|e|i|o|u/aa|ee|ii|oo|uu/gi; print $string;

Erwartete Ausgabe: iiif iit raaiins cooveer wiith uumbreelaa

Kann mir jemand bei diesem Problem helfen?

8voto

Borodin Punkte 124906

Der reguläre Ausdruck in Ihrer Substitution sollte gut funktionieren, aber wie Sie gesehen haben, ist der Ersatzstring ein einfacher String, der keine Beziehung zum Treffer hat, es sei denn, Sie erfassen Teilzeichenfolgen im regulären Ausdruck und verwenden sie im Ersatzstring.

Verwenden Sie eine Zeichenklasse, um eines der Zeichen in einer Menge von Zeichen abzugleichen, wie z. B. [aeiuo].

Verwenden Sie Klammern, um einen Teil einer Übereinstimmung 'einzufangen', damit Sie ihn im Ersatzstring verwenden können.

my $string = "wenn es regnet, mit Regenschirm bedecken";

$string =~ s/([aeiuo])/$1$1/g;

print $string;

Ausgabe

iif iit raaiins, cooveer wiith uumbreellaa

3voto

hackattack Punkte 1097

Alle Treffer werden in den Variablen $1,...,$9 erfasst, sodass, wenn Sie $1 zweimal substituieren, das Match wiederholt wird. In diesem Fall werden die Vokale verdoppelt

$string=~ s/(a|e|i|o|u)/\1\1/gi; 
print $string;

1voto

ikegami Punkte 340842

Wie bereits erwähnt, würde Folgendes in diesem Fall funktionieren:

s/([aeiuo])/$1$1/ig;    # A => AA

Oder vielleicht möchten Sie

s/([aeiuo])/\L$1$1/ig;  # A => aa

Die folgende alternative Lösung funktioniert für beliebige Übersetzungstabellen:

my %map = (
   'a' => 'aa',
   'e' => 'ee',
   'i' => 'ii',
   'o' => 'uu',
   'u' => 'oo',
);

my $pat =
   join '|',
    map quotemeta,
     sort { length($b) <=> length($a) }
      keys(%map);

s/($pat)/$map{$1}/g;

Das funktioniert sogar, wenn Sie haben

( 'foo' => 'bar',
  'bar' => 'foo' )

Die sort-Zeile kann weggelassen werden, wenn Sie nichts wie

( 'foo'  => 'bar',
  'food' => 'baz' )

0voto

Rob Volgman Punkte 2104

Sie haben nicht gedruckt, was die falsche Ausgabe war, aber Sie können einfach jeden Vokal durch sein Doppeltes ersetzen. Zum Beispiel:

$string =~ s/a/aa/g;
$string =~ s/e/ee/g;
$string =~ s/i/ii/g;
$string =~ s/o/oo/g;
$string =~ s/u/uu/g;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X