首页 > 解决方案 > 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 中,默认行为是将这些字符串视为数字。

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

标签: raku

解决方案


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

Raku 中有一些特殊值,其作用类似于 Perl 中的值。在 Raku 中,这些被称为“同种异形体”。它们是Str,但也是Num,或Rat,或Int,或Complex

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

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

那么中的值@line将是Str、 或IntStrRatStr。哪个应该像您期望的那样制作.min和工作。.max

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

%qual{$type}.push: +@line[5]

尽管您可能会觉得这太吵了。

更新:我忘记了实际上有一个 sub 调用val,它接受Str并创建它的适当同种异形体(或返回原始的Str)。所以创建的代码@line可以写成:

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

推荐阅读