私はすべての単語のすべての母音を 2 倍にすることに取り組んでいます。例:
$string="if it rains, cover with umbrella";
これが私が書いたコードですが、正しい出力が得られません。
$string=~s/a|e|i|o|u/aa|ee|ii|oo|uu/gi; print $string;
期待される出力:iif iit raaiins cooveer wiith uumbreelaa
これで誰かが私を助けることができますか?
置換の正規表現は正常に機能するはずですが、ご覧のとおり、正規表現内の部分文字列をキャプチャして置換文字列で使用しない限り、置換文字列は一致とは関係のない単純な文字列です。
文字クラスを使用して、 のような一連の文字のいずれかに一致させます[aeiuo]
。
置換文字列で使用できるように、括弧を使用して一致の一部を「キャプチャ」します。
my $string = "if it rains, cover with umbrella";
$string =~ s/([aeiuo])/$1$1/g;
print $string;
出力
iif iit raaiins, cooveer wiith uumbreellaa
すべての一致は変数 $1、...、$9 でキャプチャされるため、$1 を 2 回置換すると、一致が何であれ繰り返されます。この場合、母音が 2 倍になります。
$string=~ s/(a|e|i|o|u)/\1\1/gi;
print $string;
前述のように、この状況では次のようにするとうまくいきます。
s/([aeiuo])/$1$1/ig; # A => AA
または多分あなたがしたい
s/([aeiuo])/\L$1$1/ig; # A => aa
以下は、任意の変換マップで機能する代替ソリューションです。
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;
上記は、持っている場合でも機能します
( 'foo' => 'bar',
'bar' => 'foo' )
次のsort
ようなものがない場合は、行を省略できます
( 'foo' => 'bar',
'food' => 'baz' )
間違った出力が何であるかは出力しませんでしたが、各母音をその倍音に置き換えるだけです。例えば:
$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;