Perl 6将split函数的输出解释为整数列表/数组

时间:2019-08-07 13:40:02

标签: raku

say "1 10".split(" ") 

返回(1,10)

当我将那些110用作序列运算符[...]的参数时

say [...] "1 10".split(" ")

仅返回(1),而应该返回(1 2 3 4 5 6 7 8 9 10),这是因为split函数的输出被解释为字符串。

如何解决该问题?谢谢。

2 个答案:

答案 0 :(得分:7)

如果要进行数字运算,则强制转换为数字:

say [...] +<< "1 10".split(" "); # (1 2 3 4 5 6 7 8 9 10)

这使用<< hyperop+生成的序列的每个元素施加数字强制(前缀split)。


关于带有 string 端点的序列和范围行为:


您写的等同于:

put gist "1"..."10";

({say等同于put gist。)

gist中的"1"..."10"(1)

这是因为gist的{​​{1}}是List.new("1"),就像(1)的{​​{1}}是gist

List.new("a")的值为(a)

为什么?我不确定,但是我正在探索可用的信息。

让我们从文档开始。 doc for the infix ... op说:

  

默认生成器是"1"..."10"List.new("1"),具体取决于端点的比较方式

嗯:

*.succ

这大概意味着序列开始调用*.pred

然后:

say "1" cmp "10"; # Less

和:

*.succ

这似乎导致序列立即在“ 1”之后终止,而不是在包含“ 2”之后继续。


我将继续搜索错误队列,并检查@ wamba ++在其对上述链接的答案中链接的区域周围的代码:“为什么Perl 6序列say "1".succ; # 2 仅具有一个元素?”。

答案 1 :(得分:4)

和往常一样,raiph给出了正确的答案,但是我发现它为什么真的不起作用缺少一些东西。 最主要的是[]是reduce运算符,除了副作用之外,它没有将内部的内容用作infix运算符。例如,这有效:

say [+] <4 8>.words; # OUTPUT: «12␤»

但是仅由于有两个组件,并且将归约[]应用于它们,所以效果相同。 ...

的同上
say [...] <4 8>.words; # OUTPUT: «(4 5 6 7 8)␤»

但是,这不是您想要的。您有两个操作数,一个运算符,您想调用该运算符本身。您当然可以使用其完全限定的名称来完成

say infix:<...>( | <3 5>.words ); # OUTPUT: «(3 4 5)␤»

当然,只要您用|展平(使用|)其参数以使其与中缀运算符的签名匹配即可。

与往常一样,TIMTOWTDI。所以做最适合您的事情。