say "1 10".split(" ")
Run Code Online (Sandbox Code Playgroud)
退货 (1,10)
当我使用这些1和10作为序列运算符的参数时[...]
say [...] "1 10".split(" ")
Run Code Online (Sandbox Code Playgroud)
返回,(1)而应该返回,(1 2 3 4 5 6 7 8 9 10)我想是因为split函数的输出被解释为字符串。
如何解决这个问题?谢谢。
如果您想要数字行为,则强制使用数字:
say [...] +<< "1 10".split(" "); # (1 2 3 4 5 6 7 8 9 10)
Run Code Online (Sandbox Code Playgroud)
这使用<<hyperop将数字强制(prefix +)应用于生成的序列的每个元素split。
关于带有字符串端点的序列和范围行为:
那么,为什么Perl 6序列'A' … 'AA'只有一个元素?。链接的SO中描述的内容适用于您指定的顺序,即"1"..."10"。
具有字符串端点且没有显式生成器的开放Rakudo问题Sequence运算符会产生不直观/未记录的结果。
那么,为什么我的某些范围疯了?。
您写的内容等同于:
put gist "1"..."10";
Run Code Online (Sandbox Code Playgroud)
(say等于put gist。)
一gist的"1"..."10"是(1)。
这是因为gist的List.new("1")是(1)一样的gist的List.new("a")是(a)。
并"1"..."10"计算为List.new("1")。
为什么?我不确定,但我正在探索可用的信息。
默认生成器为
*.succ或*.pred,具体取决于端点的比较方式
好:
say "1" cmp "10"; # Less
Run Code Online (Sandbox Code Playgroud)
这大概意味着序列开始调用*.succ。
然后:
say "1".succ; # 2
Run Code Online (Sandbox Code Playgroud)
和:
say "2" cmp "10"; # More
Run Code Online (Sandbox Code Playgroud)
看来这导致序列立即在“ 1”之后终止,而不是包括“ 2”并继续。
我将继续搜索错误队列,并检查@ wamba ++在其对以上链接的SO的答案中链接的区域周围的代码:“为什么Perl 6序列'A' … 'AA'只有一个元素?”。