raku - 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 中,当您从文件中读取行时,它们会变成字符串(也就是 type 的对象Str
)。如果您在对象数组上调用.min
和,则字符串语义将用于确定某物是更大还是更小。.max
Str
Raku 中有一些特殊值,其作用类似于 Perl 中的值。在 Raku 中,这些被称为“同种异形体”。它们是Str
,但也是Num
,或Rat
,或Int
,或Complex
。
为 in 中的字符串创建适当的同种异形体的语法$_
是<< $_ >>
. 因此,如果您将读取单词的行更改为:
my @line = $line.words.map: { << $_ >> }
那么中的值@line
将是Str
、 或IntStr
或RatStr
。哪个应该像您期望的那样制作.min
和工作。.max
但是,如果您确定只有 的第 5 个元素@line
将是数字,那么Str
在推送到数组之前将 转换为数字可能更有效。一个更短的语法是前缀 a +
:
%qual{$type}.push: +@line[5]
尽管您可能会觉得这太吵了。
更新:我忘记了实际上有一个 sub 调用val
,它接受Str
并创建它的适当同种异形体(或返回原始的Str
)。所以创建的代码@line
可以写成:
my @line = $line.words>>.&val
推荐阅读
- django - 无法使用 DRF 在 Django 模板中显示图像
- wpf - 在本地/直接设置控件的(触发)属性时,ControlTemplate/Style 触发器不起作用
- javascript - Vue.js - 在另一个数组中显示嵌套数组的详细信息
- c - 如何反转C中的句子?
- paypal - 什么是 Paypal 的定期付款配置文件 RPSTATE 参数?
- postgresql - 更改 client_min_messages 和 log_min_messages
- python-3.x - 您如何比较包含不可散列对象的字典?
- c - 字符串计数问题、浮点整数、基于字母、单词和句子数量的评分公式,在 C 中
- jquery - 选中复选框时选择特定的单选选项jQuery
- c# - 如何声明一个完全限定的路径来实例化一个对象?