我有大量的数组哈希
%qual<discordant> (约13199个值,例如“ 88.23”,“ 99.23”等。
范围是88-100,并且是从文本文件中读取的,
当我打印时%qual<discordant>.min,%qual<discordant>.max我可以看到这些值显然是错误的。
我可以通过更改从文本文件读取数据的方式来解决此问题:
%qual{$type}.push: @line[5]
至
%qual{$type}.push: @line[5].Num
但这不是直观的,这花了我几分钟的时间弄清楚为什么Raku / Perl6最初给出的答案显然是错误的。错过此错误非常容易。在perl5中,默认行为是无论如何都将这些字符串视为数字。
应该有一些控制语句使它成为默认行为,我该怎么做?
Eli*_*sen 10
问题/功能实际上是在Raku中,当您从文件中读取行时,它们变成了字符串(也就是类型的对象Str)。如果在对象数组上调用.min和,则字符串语义将用于确定某个对象是较大还是较小。.maxStr
Raku中有一些特殊的值,就像Perl中的值一样。在Raku中,这些被称为“ 同种异体 ”。它们是Str,但也是Num或Rat或Int或或Complex。
为中的字符串创建合适的同种异体的语法$_是<< $_ >>。因此,如果将读取单词的行更改为:
my @line = $line.words.map: { << $_ >> }
Run Code Online (Sandbox Code Playgroud)
那么中的值@line将为Str或IntStr或RatStr。这应该.min和.max工作像你期望的那样。
但是,如果您确定的第5个元素@line将是数字,那么在将其Str压入数组之前将其转换为数字可能会更有效。简短的语法是+:
%qual{$type}.push: +@line[5]
Run Code Online (Sandbox Code Playgroud)
虽然您可能会发现线路噪音太大。
更新:我忘记了实际上有一个名为的子val,它带有一个,Str并为其创建一个合适的同种异体(或返回原始Str)。因此,用于创建的代码@line可以写为:
my @line = $line.words>>.&val
Run Code Online (Sandbox Code Playgroud)