[英]Substitution of characters in Perl
我正在努力將每個單詞中的所有元音加倍。 例如:
$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替換兩次,它將重復匹配的任何東西,在這種情況下,它會使元音加倍
$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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.