Perl: 8 oder 10 verschiedene Zeichen
s/// Lösung: 10 verschiedene, 13 insgesamt
Die (angebliche; siehe unten) sed-Technik funktioniert immer auch in Perl und liefert die Namensnummer der verschiedenen Zeichen (10):
s/[aeiou]//gi
Beispielsweise:
$ 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.
Das sind 10 verschiedene Zeichen, wie dies beweist:
$ echo 's/[aeiou]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
10
Das Problem mit der sed - Lösung ist , dass sein /iist nicht Teil von POSIX sed, und damit ist nicht tragbar:
$ 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'
Das läuft auf einem OpenBSD-System. Da im Gegensatz dazu /iist in der Tat immer Teil des Standard Perl, Sie können sie verlassen seine immer dort zu sein. Im Gegensatz zu sed.
Wenn Sie "y" in die Liste der Vokale aufnehmen möchten, ist es natürlich eins größer, wenn Sie dieselbe Technik verwenden:
$ 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
Und jetzt sind es insgesamt 14 Charaktere.
tr[][] Lösung: 8 verschiedene 10 insgesamt
Sie können auch tr///alles entfernen, was übereinstimmt. Perl kann sogar den y///Alias von sed verwenden für tr:
y/aeiou//d
Das sind jetzt 8 verschiedene Zeichen, funktioniert aber nicht in Großbuchstaben. Am Ende müssen Sie 5 weitere Zeichen hinzufügen, um mit den Fallkarten fertig zu werden:
$ echo 'y/aeiouAEIOU//d' | perl -nle '@s{split//}=(); print scalar keys %s'
13
und natürlich sind das jetzt insgesamt 15.
Wenn Sie der Mischung jedoch als Vokal „y“ hinzufügen, erhöht sich die Anzahl der unterschiedlichen Zeichen nicht wie bei der s///Version:
$ 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.
Das sind also immer noch nur die ursprünglichen 8 von insgesamt 11:
$ echo 'y/aeiouy//d' | perl -nle '@s{split//}=(); print scalar keys %s'
8
EDIT : Bilanzierung von Diakritika
Und was ist mit Eingaben wie Renée’s naïveté? Die richtige Ausgabe sollte natürlich sein Rn’s nvt. So geht's mit dem /rFlag von v5.14 s///:
$ echo 'Renée’s naïveté' |
perl5.14.0 -CS -MUnicode::Normalize -nle 'print NFD($_)=~s/[aeiou]\pM*//rgi'
Rn’s nvt
Das sind 27 verschiedene Zeichen:
$ echo 'print NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
27
Sie können , dass auf 26 trimmen , wenn Sie garantieren können , dass Sie mindestens v5.10 laufen durch das Auslagern printfür ein 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
Und Sie können es auf 22 reduzieren, wenn es Ihnen nichts ausmacht, die Diakritika zu verschieben, anstatt sie zu entfernen:
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]//rgi'
Rń’s n̈vt́
Welches ist ... interessant anzusehen, um es gelinde auszudrücken. :) Hier ist seine eindeutige Anzahl:
$ echo 'say NFD($_) =~ s/[aeiou]//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
22
Viel Glück, dass jede andere Sprache mit weniger Zeichen richtig mit Diakritika umgeht!