Курс по Raku / Приложение 🆕 / Типове и текстови машини / Регулярни изрази и граматики / Exercises / Проверете идентификатори
Решение: Проверете идентификатори
Ето едно възможно решение на задачата.
Код
for <count total2 2fast my-var _hidden> -> $name {
my $ok = $name ~~ / ^ <[A..Za..z_]> <[A..Za..z0..9_]>* $ /;
say "$name: { $ok ?? 'valid' !! 'invalid' }";
}🦋 Намерете програмата във файла validate-identifier.raku.
Изход
count: valid
total2: valid
2fast: invalid
my-var: invalid
_hidden: validКоментари
Котвите
^и$принуждават шаблона да покрие целия низ, така че един-единствен излишен знак като тирето вmy-varго прави невалиден.Първият клас от знаци допуска буква или долна черта; вторият, повторен с
*, допуска допълнително и цифри — точно по класическото правило за идентификатор.Вторият клас може да се запише и като
\w— вграденото скъсяване за словесен знак (буква, цифра или долна черта):my $ok = $name ~~ / ^ <[A..Za..z_]> \w* $ /;
Има една разлика, за която да знаете:
\wв Raku се съобразява с Unicode, така че име катоcaféсъщо минава — което, между другото, съвпада с поведението на самия Raku, къдетоmy $café = 1;е напълно законно. Разписаният клас<[A..Za..z0..9_]>държи проверката строго в рамките на ASCII.Има обаче една уловка: в самия Raku
my-varе валиден идентификатор! Raku допуска тире (или апостроф, както вisn't) вътре в името, стига след него да следва буква — затова подпрограми катоis-primeсе четат толкова естествено. За да проверявате идентификатори на Raku, допуснете такива групи след класическата част:for <count total2 2fast my-var _hidden> -> $name { my $ok = $name ~~ / ^ <[A..Za..z_]> \w* [ '-' <[A..Za..z]> \w* ]* $ /; say "$name: { $ok ?? 'valid' !! 'invalid' }"; }
Всяка група в скоби
[ '-' <[A..Za..z]> \w* ]приема тире само когато след него следва буква, така чеmy-varвече се смята за валиден, а2fast— както и низове катоa-илиa-1— все още не.