Курс 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Коментарі
Якорі
^та$змушують шаблон покривати весь рядок, тож один-єдиний зайвий символ на кшталт дефіса в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— усе ще ні.