Curso de Raku / Apéndice 🆕 / Tipos y máquinas de texto / Expresiones regulares y gramáticas / Exercises / Valide identificadores
Solución: Valide identificadores
Aquí tienes una posible solución para la tarea.
Código
for <count total2 2fast my-var _hidden> -> $name {
my $ok = $name ~~ / ^ <[A..Za..z_]> <[A..Za..z0..9_]>* $ /;
say "$name: { $ok ?? 'valid' !! 'invalid' }";
}🦋 Puedes encontrar el código fuente en el archivo validate-identifier.raku.
Salida
count: valid
total2: valid
2fast: invalid
my-var: invalid
_hidden: validComentarios
Los anclajes
^y$obligan al patrón a cubrir la cadena entera, así que un solo carácter descarriado como el guion demy-varla hace inválida.La primera clase de caracteres permite una letra o un guion bajo; la segunda, repetida con
*, permite además dígitos, correspondiéndose exactamente con la regla clásica de identificador.La segunda clase también se puede escribir como
\w, la abreviatura integrada para un carácter de palabra (una letra, un dígito o un guion bajo):my $ok = $name ~~ / ^ <[A..Za..z_]> \w* $ /;
Una diferencia que conviene tener en cuenta: en Raku,
\wes consciente de Unicode, así que un nombre comocafétambién pasa, lo que casualmente coincide con el propio Raku, dondemy $café = 1;es perfectamente legal. La clase deletreada<[A..Za..z0..9_]>mantiene la comprobación estrictamente en ASCII.Hay un giro, sin embargo: ¡en el propio Raku
my-varsí es un identificador válido! Raku permite un guion (o un apóstrofo, como enisn't) dentro de un nombre, siempre que le siga una letra, y por eso subrutinas comois-primese leen con tanta naturalidad. Para validar identificadores de Raku, permite esos grupos después de la parte clásica:for <count total2 2fast my-var _hidden> -> $name { my $ok = $name ~~ / ^ <[A..Za..z_]> \w* [ '-' <[A..Za..z]> \w* ]* $ /; say "$name: { $ok ?? 'valid' !! 'invalid' }"; }
Cada grupo entre corchetes
[ '-' <[A..Za..z]> \w* ]acepta un guion solo cuando le sigue una letra, así quemy-varse informa ahora como válido, mientras que2fast—y cadenas comoa-oa-1— siguen sin serlo.
Navegación del curso
← Valide identificadores | Una gramática para nombres completos →