Eu tenho um grande hash de matrizes,
%qual<discordant>
(~ aprox. 13199 valores como '88 .23 ', '99 .23' etc.
que varia de 88 a 100 e são lidos em arquivos de texto,
e quando imprimo %qual<discordant>.min
e %qual<discordant>.max
vejo que os valores estão claramente errados.
Eu posso corrigir isso alterando a maneira como os dados são lidos nos arquivos de texto:
%qual{$type}.push: @line[5]
para
%qual{$type}.push: @line[5].Num
mas isso não foi intuitivo, levei alguns minutos para descobrir por que Raku / Perl6 estava dando respostas claramente incorretas no início. Teria sido muito fácil perder esse erro. No perl5, o comportamento padrão seria tratar essas seqüências como números de qualquer maneira.
Deve haver alguma declaração de controle para tornar esse comportamento padrão, como posso fazer isso?
@line
preenchido?@line
está cheio de arquivos de texto,my @line = $line.split(/\s+/)
my @line = $line.words
será então mais rápido.Respostas:
O problema / característica é realmente que, no Raku, quando você lê linhas de um arquivo, elas se tornam cadeias de caracteres (também conhecidas como objetos do tipo
Str
). Se você chamar.min
e.max
em uma matriz deStr
objetos, a semântica de cadeias será usada para determinar se algo é maior ou menor.Não são valores especiais em Raku que agem como valores em Perl. Em Raku, eles são chamados de " alomorfos ". Eles são
Str
, mas tambémNum
, ouRat
, ouInt
, ouComplex
.A sintaxe para criar um alomorfo apropriado para uma string em
$_
é<< $_ >>
. Portanto, se você alterar a linha que lê as palavras para:então os valores em
@line
serão ouStr
ouIntStr
ouRatStr
. O que deve fazer.min
e.max
funcionar como você espera.No entanto, se você tiver certeza de que apenas o quinto elemento
@line
será numérico, provavelmente será mais eficiente converter oStr
número em um número antes de enviar para a matriz. Uma sintaxe mais curta seria o prefixo de+
:Embora você possa achar isso muito barulhento.
ATUALIZAÇÃO: Eu tinha esquecido que na verdade há um sub chamado
val
que pega umStr
e cria um alomorfo apropriado (ou retorna o originalStr
). Portanto, o código para criação@line
pode ser escrito como:fonte
.Numeric
vez de+
em parte para evitar muitos símbolos seguidos, mas também porque salta um pouco mais para dizer "Ei, eu preciso disso como um número",+
é pequeno o suficiente para se perder. o shuffle (idem para~
vs.Str
).83.44
numéricoval($line)
não faria isso por você?