Raku-Kurs / Anhang 🆕 / Typen und Textmaschinen / Reguläre Ausdrücke und Grammatiken / Exercises / Bezeichner prüfen
Lösung: Bezeichner prüfen
Hier ist eine mögliche Lösung der Aufgabe.
Code
for <count total2 2fast my-var _hidden> -> $name {
my $ok = $name ~~ / ^ <[A..Za..z_]> <[A..Za..z0..9_]>* $ /;
say "$name: { $ok ?? 'valid' !! 'invalid' }";
}🦋 Du findest den Quellcode in der Datei validate-identifier.raku.
Ausgabe
count: valid
total2: valid
2fast: invalid
my-var: invalid
_hidden: validKommentare
Die Anker
^und$zwingen das Muster, die ganze Zeichenkette abzudecken, ein einziges verirrtes Zeichen wie der Bindestrich inmy-varmacht sie also ungültig.Die erste Zeichenklasse erlaubt einen Buchstaben oder Unterstrich; die zweite, mit
*wiederholt, erlaubt zusätzlich Ziffern — was genau der klassischen Bezeichnerregel entspricht.Die zweite Klasse lässt sich auch als
\wschreiben, die eingebaute Kurzform für ein Wortzeichen (einen Buchstaben, eine Ziffer oder einen Unterstrich):my $ok = $name ~~ / ^ <[A..Za..z_]> \w* $ /;
Ein Unterschied, den man kennen sollte:
\wist in Raku Unicode-bewusst, ein Name wiecafébesteht die Prüfung also ebenfalls — was zufällig zu Raku selbst passt, womy $café = 1;völlig zulässig ist. Die ausgeschriebene Klasse<[A..Za..z0..9_]>hält die Prüfung streng bei ASCII.Es gibt allerdings eine Wendung: In Raku selbst ist
my-varein gültiger Bezeichner! Raku erlaubt einen Bindestrich (oder einen Apostroph, wie inisn't) innerhalb eines Namens, solange ihm ein Buchstabe folgt — und deshalb lesen sich Subroutinen wieis-primeso natürlich. Um Raku-Bezeichner zu prüfen, erlauben Sie solche Gruppen nach dem klassischen Teil:for <count total2 2fast my-var _hidden> -> $name { my $ok = $name ~~ / ^ <[A..Za..z_]> \w* [ '-' <[A..Za..z]> \w* ]* $ /; say "$name: { $ok ?? 'valid' !! 'invalid' }"; }
Jede geklammerte Gruppe
[ '-' <[A..Za..z]> \w* ]nimmt einen Bindestrich nur an, wenn ein Buchstabe folgt,my-varwird nun also als gültig gemeldet, während2fast— und Zeichenketten wiea-odera-1— es weiterhin nicht sind.
Kursnavigation
← Bezeichner prüfen | Eine Grammatik für vollständige Namen →