Corso di Raku / Appendice 🆕 / Tipi e macchine per il testo / Espressioni regolari e grammatiche / Exercises / Convalidate gli identificatori
Soluzione: Convalidate gli identificatori
Ecco una possibile soluzione del compito.
Codice
for <count total2 2fast my-var _hidden> -> $name {
my $ok = $name ~~ / ^ <[A..Za..z_]> <[A..Za..z0..9_]>* $ /;
say "$name: { $ok ?? 'valid' !! 'invalid' }";
}🦋 Trova il programma nel file validate-identifier.raku.
Output
count: valid
total2: valid
2fast: invalid
my-var: invalid
_hidden: validCommenti
Le ancore
^e$costringono lo schema a coprire l’intera stringa, quindi un solo carattere fuori posto come il trattino inmy-varlo rende non valido.La prima classe di caratteri ammette una lettera o un trattino basso; la seconda, ripetuta con
*, ammette in più le cifre — corrispondendo esattamente alla regola classica degli identificatori.La seconda classe si può anche scrivere come
\w, la scorciatoia incorporata per un carattere di parola (una lettera, una cifra o un trattino basso):my $ok = $name ~~ / ^ <[A..Za..z_]> \w* $ /;
Una differenza di cui essere consapevoli:
\win Raku è consapevole di Unicode, quindi anche un nome comecafépassa — cosa che per inciso corrisponde a Raku stesso, dovemy $café = 1;è perfettamente lecito. La classe scritta per esteso<[A..Za..z0..9_]>tiene il controllo strettamente ASCII.C’è però un colpo di scena: in Raku stesso
my-varè un identificatore valido! Raku ammette un trattino (o un apostrofo, come inisn't) dentro un nome, purché sia seguito da una lettera — ed è per questo che subroutine comeis-primesi leggono così naturalmente. Per convalidare gli identificatori Raku, ammetti gruppi simili dopo la parte classica:for <count total2 2fast my-var _hidden> -> $name { my $ok = $name ~~ / ^ <[A..Za..z_]> \w* [ '-' <[A..Za..z]> \w* ]* $ /; say "$name: { $ok ?? 'valid' !! 'invalid' }"; }
Ogni gruppo fra parentesi
[ '-' <[A..Za..z]> \w* ]accetta un trattino solo quando segue una lettera, quindimy-varviene ora riferito come valido, mentre2fast— e stringhe comea-oa-1— continuano a non esserlo.
Navigazione del corso
← Convalidate gli identificatori | Una grammatica per i nomi completi →