Perl:8または10個の異なる文字
s///
解決策:10の異なる、合計13
(意図されている。以下を参照)sedテクニックは常にperlでも機能し、異なる文字の名前番号を生成します(10):
s/[aeiou]//gi
例えば:
$ echo 'This program will remove VOWELS. So we can speak without them.' |
perl -ple 's/[aeiou]//gi'
Ths prgrm wll rmv VWLS. S w cn spk wtht thm.
これが証明するように、これは10の異なる文字です。
$ echo 's/[aeiou]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
10
sedの解決策の問題は、そのがいることである/i
であるではないのsed POSIXの一部は、したがって、移植性がありません。
$ echo 'This program will remove VOWELS. So we can speak without them.' |
sed -e 's/[aeiou]//gi'
sed: 1: "s/[aeiou]//gi": bad flag in substitute command: 'i'
これはOpenBSDシステムで実行されています。対照的に、/i
実際には常に標準perlの一部であるため、常に存在することを期待できます。sedとは異なり。
母音のリストに「y」を含めたい場合、同じ手法を使用すると、もちろん1つ大きくなります。
$ echo 'This nifty program remove any VOWELS. So we easily can speak without them.' |
perl -ple 's/[aeiouy]//gi'
Ths nft prgrm rmv n VWLS. S w sl cn spk wtht thm.
$ echo 's/[aeiouy]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
11
そして現在、合計14文字です。
tr[][]
解決策:8つの異なる10合計
tr///
一致するものはすべて削除することもできます。Perlはsedのy///
エイリアスも使用できますtr
:
y/aeiou//d
現在は8つの異なる文字ですが、大文字では機能しません。ケースマップに対処するには、さらに5文字を追加する必要があります。
$ echo 'y/aeiouAEIOU//d' | perl -nle '@s{split//}=(); print scalar keys %s'
13
そしてもちろん、それは合計15です。
ただし、「y」を母音としてミックスに追加しても、s///
バージョンで行ったように異なる文字の数は増えません。
$ echo 'This nifty program remove any VOWELS. So we easily can speak without them.' |
perl -ple 'y/aeiouy//d'
Ths nft prgrm rmv n VOWELS. S w sl cn spk wtht thm.
したがって、これはまだ合計11個のうち8個だけです。
$ echo 'y/aeiouy//d' | perl -nle '@s{split//}=(); print scalar keys %s'
8
編集:発音区別符号の会計
そして、入力のようなものはどうRenée’s naïveté
ですか?正しい出力はもちろんですRn’s nvt
。以下にv5.14の/r
フラグを使用して、これを行う方法を示しますs///
。
$ echo 'Renée’s naïveté' |
perl5.14.0 -CS -MUnicode::Normalize -nle 'print NFD($_)=~s/[aeiou]\pM*//rgi'
Rn’s nvt
それは27の異なる文字です:
$ echo 'print NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
27
あなたはスワップアウトすることにより、少なくともV5.10で実行していることを保証できる場合は、26にいることをトリミングすることができprint
ためにsay
:
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]\pM*//rgi'
Rn’s nvt
$ echo 'say NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
26
また、発音区別記号を削除する代わりに移動することを気にしない場合は、22まで下げることができます。
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]//rgi'
Rń’s n̈vt́
控えめに言っても、これは... 興味深いものです。:)以下がその個別カウントです。
$ echo 'say NFD($_) =~ s/[aeiou]//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
22
これより少ない文字を使用して発音区別符号に適切に対処するために、他の言語を入手してください!