Raku控制语句使数字字符串解释为数字

con*_*con 8 raku

我有大量的数组哈希

%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,但也是NumRatInt或或Complex

为中的字符串创建合适的同种异体的语法$_<< $_ >>。因此,如果将读取单词的行更改为:

my @line = $line.words.map: { << $_ >> }
Run Code Online (Sandbox Code Playgroud)

那么中的值@line将为StrIntStrRatStr。这应该.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)