say "1 10".split(" ")
返回(1,10)
当我将那些1
和10
用作序列运算符[...]
的参数时
say [...] "1 10".split(" ")
仅返回(1)
,而应该返回(1 2 3 4 5 6 7 8 9 10)
,这是因为split函数的输出被解释为字符串。
如何解决该问题?谢谢。
答案 0 :(得分:7)
如果要进行数字运算,则强制转换为数字:
say [...] +<< "1 10".split(" "); # (1 2 3 4 5 6 7 8 9 10)
这使用<<
hyperop对+
生成的序列的每个元素施加数字强制(前缀split
)。
关于带有 string 端点的序列和范围行为:
SO Why does the Perl 6 sequence 'A' … 'AA'
have only one element?。链接的SO中描述的内容适用于您指定的序列,即"1"..."10"
。
您写的等同于:
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。所以做最适合您的事情。