使数字字符串解释为数字的 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
中的值将是 Str
、IntStr
或 RatStr
。这应该使 .min
和 .max
像您期望的那样工作。
但是,如果您确定只有 @line
的第 5 个元素是数字,那么在推送到数组之前将 Str
转换为数字可能更有效.一个较短的语法是在 +
:
前加上前缀
%qual{$type}.push: +@line[5]
虽然您可能会觉得线路太吵了。
更新:我忘记了实际上有一个名为 val
的子程序,它采用 Str
并创建它的适当同质异形体(或 returns 原始 Str
).所以创建 @line
的代码可以写成:
my @line = $line.words>>.&val
我有一个很大的数组散列,
%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
中的值将是 Str
、IntStr
或 RatStr
。这应该使 .min
和 .max
像您期望的那样工作。
但是,如果您确定只有 @line
的第 5 个元素是数字,那么在推送到数组之前将 Str
转换为数字可能更有效.一个较短的语法是在 +
:
%qual{$type}.push: +@line[5]
虽然您可能会觉得线路太吵了。
更新:我忘记了实际上有一个名为 val
的子程序,它采用 Str
并创建它的适当同质异形体(或 returns 原始 Str
).所以创建 @line
的代码可以写成:
my @line = $line.words>>.&val