Perl: 8 atau 10 karakter berbeda
s/// solusi: 10 berbeda, 13 total
The (konon; lihat di bawah) teknik sed selalu bekerja di perl, juga, dan menghasilkan nomor nama karakter yang berbeda (10):
s/[aeiou]//gi
Sebagai contoh:
$ 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.
Itu 10 karakter berbeda, karena ini membuktikan:
$ echo 's/[aeiou]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
10
Masalah dengan solusi sed adalah bahwa yang /imerupakan bukan bagian dari POSIX sed, dan dengan demikian tidak portabel:
$ 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'
Itu berjalan pada sistem OpenBSD. Sebaliknya, karena /imemang selalu menjadi bagian dari perl standar, Anda dapat mengandalkan selalu ada di sana. Tidak seperti sed.
Jika Anda ingin memasukkan "y" dalam daftar vokal, tentu saja lebih besar jika Anda menggunakan teknik yang sama:
$ 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
Dan sekarang 14 total karakter.
tr[][] solusi: 8 total 10 berbeda
Anda juga dapat menggunakan tr///untuk menghapus apa pun yang cocok. Perl bahkan dapat menggunakan y///alias sed untuk tr:
y/aeiou//d
yang sekarang 8 karakter berbeda, tetapi tidak berfungsi pada huruf besar. Anda akhirnya harus menambahkan 5 karakter lagi untuk mengatasi casemaps:
$ echo 'y/aeiouAEIOU//d' | perl -nle '@s{split//}=(); print scalar keys %s'
13
dan tentu saja sekarang 15 total.
Namun, menambahkan "y" ke dalam campuran sebagai vokal tidak menambah jumlah karakter berbeda seperti yang terjadi pada s///versi:
$ 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.
Jadi itu masih hanya 8 yang asli dari total 11:
$ echo 'y/aeiouy//d' | perl -nle '@s{split//}=(); print scalar keys %s'
8
EDIT : Akuntansi untuk Diakritik
Dan bagaimana dengan input Renée’s naïveté? Output yang benar tentunya Rn’s nvt. Berikut cara melakukannya, menggunakan /rbendera v5.14 untuk s///:
$ echo 'Renée’s naïveté' |
perl5.14.0 -CS -MUnicode::Normalize -nle 'print NFD($_)=~s/[aeiou]\pM*//rgi'
Rn’s nvt
Itu 27 karakter yang berbeda:
$ echo 'print NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
27
Anda dapat memotongnya menjadi 26 jika Anda dapat menjamin bahwa Anda menjalankan setidaknya v5.10 dengan menukar printuntuk 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
Dan Anda bisa menurunkannya menjadi 22 jika Anda tidak keberatan memindahkan diakritik alih-alih menghapusnya:
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]//rgi'
Rń’s n̈vt́
Yang ... menarik untuk dilihat, untuk sedikitnya. :) Inilah hitungan-nya yang berbeda:
$ echo 'say NFD($_) =~ s/[aeiou]//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
22
Semoga berhasil mendapatkan bahasa lain untuk menangani diakritik dengan menggunakan karakter lebih sedikit dari ini!