Курс языка программирования 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— по-прежнему нет.