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

Raku control statement to make numeric strings interpreted as numeric

我有一个很大的数组散列,

%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 中,默认行为无论如何都将这些字符串视为数字。

应该有一些控制语句来使它成为默认行为,我该怎么做?

问题/功能实际上是在 Raku 中,当您从文件中读取行时,它们会变成字符串(也称为 Str 类型的对象)。如果您在 Str 对象的数组上调用 .min.max,则将使用字符串语义来确定某物是更大还是更小。

Raku 中 个特殊值,其作用类似于 Perl 中的值。在 Raku 中,这些被称为“allomorphs”。他们是Str,也是Num,或Rat,或Int,或Complex

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

my @line = $line.words.map: { << $_ >> }

那么 @line 中的值将是 StrIntStrRatStr。这应该使 .min.max 像您期望的那样工作。

但是,如果您确定只有 @line 的第 5 个元素是数字,那么在推送到数组之前将 Str 转换为数字可能更有效.一个较短的语法是在 +:

前加上前缀
%qual{$type}.push: +@line[5]

虽然您可能会觉得线路太吵了。

更新:我忘记了实际上有一个名为 val 的子程序,它采用 Str 并创建它的适当同质异形体(或 returns 原始 Str ).所以创建 @line 的代码可以写成:

my @line = $line.words>>.&val