如何从原始订单中的超级高级版中获取元素?

时间:2015-04-17 14:10:33

标签: perl6

我想将一个字符串拆分成单词并将每个单词打印在一个单独的行上,所以我尝试了以下内容:

"foo bar baz".words>>.say

然而,结果不是按顺序排列:

baz
foo
bar

这有什么问题?

3 个答案:

答案 0 :(得分:4)

引用design docs

  

hyperoperator是您可以向优化器承诺您的代码可以并行化的方法之一。

其他方法是hyperrace,我认为这些方法都不会在Rakudo中实施。

如果您关心评估顺序,请使用for循环,map.map代替超级运算符,例如

"foo bar baz".words.map(&say)

使用say的方法形式直接等效原始代码将会读取

"foo bar baz".words.map(*.say)

答案 1 :(得分:4)

Hyperoperators实际上确实按顺序返回结果。你的代码的问题是hyperops不是循环结构;他们是列表运营商。因此,他们的执行顺序无法保证,并且使用它们的代码不正确。如果你关心执行顺序,你应该使用像for这样的结构来保证它。

例如,这个

my @a = "foo bar baz".words>>.split("a");
无论每个元素的计算顺序如何,

都会导致@a包含您期望的元素:

foo b r b z

答案 2 :(得分:1)

当给出一个简单的列表时,允许hyperoperator以任何顺序处理元素。此属性有助于并行化。

如果您只想按顺序对数组的每个元素执行操作,请使用for,而不是:

for "foo bar baz".words { .say }

打印您要查找的内容:

foo
bar
baz

更新

我把执行和任务混为一谈。请参阅darch更正确(和接受)的答案。