Raku kurss / Pielikums 🆕 / Tipi un teksta mašīnas / Regulārās izteiksmes un gramatikas / Exercises / Pārbaudiet identifikatorus
Risinājums: Pārbaudiet identifikatorus
Šeit ir iespējams risinājums uzdevumam.
Kods
for <count total2 2fast my-var _hidden> -> $name {
my $ok = $name ~~ / ^ <[A..Za..z_]> <[A..Za..z0..9_]>* $ /;
say "$name: { $ok ?? 'valid' !! 'invalid' }";
}🦋 Atrodiet programmu failā validate-identifier.raku.
Izvade
count: valid
total2: valid
2fast: invalid
my-var: invalid
_hidden: validKomentāri
Enkuri
^un$liek paraugam nosegt visu virkni, tāpēc viena vienīga svešzīme, piemēram, defise vārdāmy-var, padara to nederīgu.Pirmā rakstzīmju klase pieļauj burtu vai pasvītrojumu; otrā, atkārtota ar
*, papildus pieļauj ciparus, — tieši klasiskais identifikatora likums.Otro klasi var uzrakstīt arī kā
\w, iebūvēto saīsinājumu vārda rakstzīmei (burtam, ciparam vai pasvītrojumam):my $ok = $name ~~ / ^ <[A..Za..z_]> \w* $ /;
Viena atšķirība, ko vērts zināt:
\wRaku valodā prot Unikodu, tāpēc tādu vārdu kācaféarī izlaiž cauri — un tas gadās sakrist ar pašu Raku, kurmy $café = 1;ir pilnīgi likumīgi. Izrakstītā klase<[A..Za..z0..9_]>pārbaudi patur stingri ASCII robežās.Ir gan viens āķis: pašā Raku
my-varir derīgs identifikators! Raku vārda iekšienē pieļauj defisi (vai apostrofu, kā vārdāisn't), ja vien tai seko burts, — un tieši tāpēc apakšprogrammas, piemēram,is-prime, lasās tik dabiski. Lai pārbaudītu Raku identifikatorus, pieļaujiet šādas grupas pēc klasiskās daļas:for <count total2 2fast my-var _hidden> -> $name { my $ok = $name ~~ / ^ <[A..Za..z_]> \w* [ '-' <[A..Za..z]> \w* ]* $ /; say "$name: { $ok ?? 'valid' !! 'invalid' }"; }
Katra iekavotā grupa
[ '-' <[A..Za..z]> \w* ]defisi pieņem tikai tad, kad tai seko burts, tāpēcmy-vartagad tiek paziņots kā derīgs, bet2fast— un tādas virknes kāa-vaia-1— joprojām nē.