Perl: 8 veya 10 farklı karakter
s///
çözüm: 10 farklı, toplam 13
Sed tekniği her zaman perl'de de çalışır ve farklı karakterlerin ad sayısını verir (10):
s/[aeiou]//gi
Örneğin:
$ 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.
Bu, kanıtladığı gibi 10 farklı karakterdir:
$ echo 's/[aeiou]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
10
Sed çözüm ile ilgili sorun, onun olmasıdır /i
olduğu değil sed POSIX'e bir parçası olduğundan ve bu nedenle taşınabilir değildir:
$ 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'
Bu bir OpenBSD sisteminde çalışıyor. Buna karşılık, çünkü /i
standart Perl parçası daima gerçekten de, sen yapabilirsiniz onun hep orada olmak güveniyoruz. Sed aksine.
Sesli harf listesine “y” eklemek istiyorsanız, aynı tekniği kullanmak elbette daha büyüktür:
$ 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
Ve şimdi toplam 14 karakter.
tr[][]
çözüm: 8 farklı 10 toplam
tr///
Eşleşen her şeyi kaldırmak için de kullanabilirsiniz . Perl, sed'in y///
takma adını şu amaçlarla bile kullanabilir tr
:
y/aeiou//d
Şimdi 8 farklı karakterdir, ancak büyük harfle çalışmaz. Casemaplarla başa çıkmak için 5 karakter daha eklemeniz gerekiyor:
$ echo 'y/aeiouAEIOU//d' | perl -nle '@s{split//}=(); print scalar keys %s'
13
ve elbette bu toplamda 15.
Ancak, karmaya sesli harf olarak “y” eklenmesi, s///
sürümde olduğu gibi farklı karakter sayısını artırmaz :
$ 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.
Yani bu hala 11 toplamın sadece 8 farklısı:
$ echo 'y/aeiouy//d' | perl -nle '@s{split//}=(); print scalar keys %s'
8
EDIT : Aksanların Muhasebesi
Peki ya girdiler gibi Renée’s naïveté
? Doğru çıktı elbette olmalıdır Rn’s nvt
. V5.14'ün /r
bayrağını kullanarak bunu nasıl yapacağınız aşağıda açıklanmıştır s///
:
$ echo 'Renée’s naïveté' |
perl5.14.0 -CS -MUnicode::Normalize -nle 'print NFD($_)=~s/[aeiou]\pM*//rgi'
Rn’s nvt
Bu 27 ayrı karakter:
$ echo 'print NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
27
Eğer değiştirerek az V5.10 ilerliyoruz garanti edebilir eğer 26'ya kesmeli edebilirsiniz print
bir için 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
Ve aksanları çıkarmak yerine hareket ettirmek istemiyorsanız 22'ye düşebilirsiniz:
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]//rgi'
Rń’s n̈vt́
Hangi ... en azından söylemek ilginç . :) İşte farklı sayısı:
$ echo 'say NFD($_) =~ s/[aeiou]//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
22
Bundan daha az karakter kullanarak aksanlarla düzgün bir şekilde başa çıkmak için başka bir dil elde etmek iyi şanslar!