Курс Raku / Додаток 🆕 / Типи та текстові машини / Регулярні вирази та граматики / Вправи / Перевірте ідентифікатори

Розв’язання: Перевірте ідентифікатори

Ось одне з можливих розв’язань задачі.

Код

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 — усе ще ні.

Навігація курсом

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