【问题标题】:Perl 6 interpreting the output of the split function as an integer list / arrayPerl 6 将 split 函数的输出解释为整数列表/数组
【发布时间】:2019-08-07 13:40:02
【问题描述】:
say "1 10".split(" ") 

返回(1,10)

当我使用110 作为序列运算符[...] 的参数时

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

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

如何解决这个问题?谢谢。

【问题讨论】:

  • 第三个数字放在哪里?顺便说一句,say [...] "1 10".split(" ").Seq 没有削减它。它只返回(1),而预期返回(1 2 3 4 5 6 7 8 9 10)
  • "1 10".split(" ") 返回一个序列——我使用(1,10).Seq 使其等效。至于把第三个数字放在哪里:这不像我建议的那样起作用,请忽略。
  • "范围运算符 [...]" 您的代码 is 使用您正在显示的操作(省略号或 3 点,...) 但那不是 Range op。中缀...the sequence operator。它采用一个或多个初始值和一个可选的生成器在它的左边,一个智能匹配在它的右边,并构造一个@987654322 @。还有还有一个中缀2range operator,它构造了一个Range
  • 是三个点,我的意思不是包含三个点的特殊字符。但是我现在刚刚尝试使用特殊字符,它确实对结果没有影响,即我仍然需要在两者之间放置 +(1 2 3 4 5 6 7 8 9 10)
  • 对。三个点的含义与特殊省略号字符完全相同。他们是别名操作。我的意思是,您将其称为“范围”运算符,但范围是 P6 中与序列不同的特定事物,并且范围运算符是 两个 点,而不是三个点。 Anyhoo,我看到您已经编辑了您的问题,将其称为序列操作,因此现在一切都已解决。 :)

标签: raku


【解决方案1】:

如果您想要数字行为,则强制转换为数字:

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

这使用&lt;&lt; hyperop 将数字强制(前缀+)应用于split 生成的序列的每个元素。


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


你写的相当于:

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

say 等价于put gist。)

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

这是因为List.new("1")gist(1),就像List.new("a")gist(a)

"1"..."10" 的计算结果为List.new("1")

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

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

默认生成器是*.succ*.pred,具体取决于端点的比较方式

嗯:

say "1" cmp "10"; # Less

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

然后:

say "1".succ;     # 2

和:

say "2" cmp "10"; # More

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


我将继续搜索错误队列并检查 @wamba++ 在他们对上述链接 SO“为什么 Perl 6 序列 'A' … 'AA' 只有一个元素?”的回答中链接的区域周围的代码。

【讨论】:

  • 感谢您的回答。有效。所以,hyperop 成功了,这很好。我想知道它是如何将 split 的“1 10”输出解释为 just (1) 的,现在我明白了。
  • 操作。我忘了在那里勾选答案。 Håkon 的答案是第一位的,它或多或少地解决了这个问题,但不知何故,我仍然没有将其作为答案。然后是您的综合答案,我将其应用于我的代码。我想是因为我忙于微调我的代码,所以我一定忘记勾选答案了。因为您的答案既解决了问题,同时也解释了 Perl 6 的工作方式,所以这是一个更好的答案,所以我将其标记为答案:)
【解决方案2】:

像往常一样,raiph 给出了正确的答案,但我发现它为什么真的不起作用。 主要的是 [] 是一个 reduce 运算符,它不会将其中的任何内容作为中缀运算符应用,除非作为副作用。例如,这有效:

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

但只是因为有两个组件,并且对它们应用reduce [],具有相同的效果。 ... 同上

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

但是,这不是您想要的。你有两个操作数,一个操作符,你想调用操作符本身。你当然可以通过使用它的完全限定名来做到这一点

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

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

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

【讨论】:

  • 它不起作用的真正原因不是你的想法。 say infix:&lt;...&gt;( | &lt;1 10&gt;.words ); # OUTPUT: «(1)␤» 表明问题仍然存在于您对语法的重新表述中。它与我链接到的'A' ... 'AA' SO 相同。但到目前为止,我的回答有点仓促和神秘。我计划在第二天左右改进它,一旦我觉得我已经收集了相关的错误报告、问题、irc 和设计文档讨论,特别是由拉里和 Rakudo 代码行,并且可以提炼出所有这些来解释它的连贯性我能应付。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2014-02-25
  • 2021-02-27
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多