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

Комментарии

  1. Якоря ^ и $ заставляют шаблон покрывать всю строку, поэтому один-единственный посторонний символ вроде дефиса в my-var делает её недопустимой.

  2. Первый класс символов допускает букву или подчёркивание, а второй, повторяемый через *, дополнительно допускает цифры — это в точности классическое правило идентификатора.

  3. Второй класс можно записать и как \w — встроенное сокращение для словесного символа (буквы, цифры или подчёркивания):

    my $ok = $name ~~ / ^ <[A..Za..z_]> \w* $ /;

    Об одном отличии стоит помнить: \w в Raku учитывает Unicode, поэтому имя вроде café тоже пройдёт проверку, — что, кстати, соответствует самому Raku, где my $café = 1; совершенно законно. Выписанный класс <[A..Za..z0..9_]> удерживает проверку строго в рамках ASCII.

  4. Есть, впрочем, и подвох: в самом 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 — по-прежнему нет.

Навигация по курсу

Проверьте идентификаторы   |   Грамматика для полных имён