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>.min
y %qual<discordant>.max
puedo 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?
@line
se llena?@line
está lleno de archivos de texto,my @line = $line.split(/\s+/)
my @line = $line.words
Entonces 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.min
y.max
en una matriz deStr
objetos, 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
@line
serán oStr
,IntStr
oRatStr
. Lo que debería hacer.min
y.max
funcionar como esperabas.Sin embargo, si está seguro de que solo el quinto elemento de
@line
va a ser numérico, entonces probablemente sea más eficiente convertirloStr
a 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
val
que toma unStr
y crea un alomorfo apropiado (o devuelve el originalStr
). Entonces el código para crear@line
podría escribirse como:fuente
.Numeric
lugar 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.44
como numéricasval($line)
no lo haría por ti?