Tengo un gran hash de matrices,
%qual<discordant> (~ aproximadamente 13199 valores como '88 .23 ', '99 .23', etc.
que oscila entre 88 y 100, y se leen desde archivos de texto,
y cuando imprimo %qual<discordant>.miny %qual<discordant>.maxpuedo ver que los valores están claramente equivocados.
Puedo solucionar esto cambiando cómo se leen los datos de los archivos de texto:
%qual{$type}.push: @line[5]
a
%qual{$type}.push: @line[5].Num
pero esto no era intuitivo, me llevó unos minutos descubrir por qué Raku / Perl6 estaba dando respuestas claramente incorrectas al principio. Hubiera sido muy fácil pasar por alto este error. En perl5, el comportamiento predeterminado sería tratar estas cadenas como números de todos modos.
Debería haber alguna declaración de control para hacer que este sea el comportamiento predeterminado, ¿cómo puedo hacer esto?

@linese llena?@lineestá lleno de archivos de texto,my @line = $line.split(/\s+/)my @line = $line.wordsEntonces será más rápido.Respuestas:
El problema / característica es realmente que en Raku cuando lees líneas de un archivo, se convierten en cadenas (también conocidos como objetos de tipo
Str). Si llama.miny.maxen una matriz deStrobjetos, se usará la semántica de cadenas para determinar si algo es más grande o más pequeño.No son valores especiales en Raku que actúan como valores en Perl. En Raku, estos se llaman " alomorfos ". Son
Str, pero tambiénNum, oRat, oInt, oComplex.La sintaxis para crear un alomorfo apropiado para una cadena
$_es<< $_ >>. Entonces, si cambia la línea que lee las palabras a:entonces los valores en
@lineserán oStr,IntStroRatStr. Lo que debería hacer.miny.maxfuncionar como esperabas.Sin embargo, si está seguro de que solo el quinto elemento de
@lineva a ser numérico, entonces probablemente sea más eficiente convertirloStra un número antes de pasar a la matriz. Una sintaxis más corta para eso sería prefijar a+:Aunque puede que te parezca demasiado ruidoso.
ACTUALIZACIÓN: Había olvidado que en realidad hay un sub llamado
valque toma unStry crea un alomorfo apropiado (o devuelve el originalStr). Entonces el código para crear@linepodría escribirse como:fuente
.Numericlugar de+en parte para evitar demasiados símbolos seguidos, pero también porque salta un poco más para decir "Oye, necesito esto como un número",+es lo suficientemente pequeño como para perderse en el shuffle (ídem para~vs.Str).83.44como numéricasval($line)no lo haría por ti?