如何在Perl 6中切割成形数组?

bri*_*foy 9 slice multidimensional-array perl6

我可以制作一个形状(固定大小)的数组:

my @array[3;3] = (
    < 1 2 3 >,
    < 4 5 6 >,
    < 7 8 9 >
    );

say @array;       # [[1 2 3] [4 5 6] [7 8 9]]
say @array[1;1];  # 5
Run Code Online (Sandbox Code Playgroud)

如何切片以获得我想要的任何特定列或对角线(行很容易)?

如何将每个维度中的索引列表转换为正确的方括号?

而且,肯定有一些花哨的语法可以阻止我做一些复杂的事情:

my @diagonal = gather {
    my @ends = @array.shape.map: { (0 ..^ $^a).List };
    for [Z] @ends {
        take @array[ $_ ] # how do I make that $_[0];$_[1];...
        };
    }
Run Code Online (Sandbox Code Playgroud)

rai*_*iph 5

如何切片以获得我想要的任何特定列或对角线?

据我所知,你现在不能使用形状数组的切片语法(尽管你的"(行很容易)"评论,这使我对你的帖子的评论感到困惑).

显而易见的解决方案是删除形状并使用切片语法:

my @array = ( < 1 2 3 >, < 4 5 6 >, < 7 8 9 > );

say @array[1];         # 4 5 6 (second row)
say @array[1;*];       # same
say @array[*;1];       # 2 5 8 (second column)
Run Code Online (Sandbox Code Playgroud)

如果你想保留使用形状数组的边界检查安全性(和/或形状原生数组的C数组兼容性,如果我是对的那样)那么你可能必须保留数组的两个副本周围,​​使用一个保持形状阵列的所需方面,另一个切片.

如何将每个维度中的索引列表转换为正确的方括号?

最终叶子之前的每个维度切片必须与a分开;.

我还不清楚这是因为它;是一个语句分隔符(在下标中)还是列表列表指示符,也不知道如何以编程方式将索引列表转换为该表单.(调查仍在继续.)

并且,肯定有一些花哨的语法可以阻止我做一些复杂的事情[对角切片]:

say @array[*;{$++}];   # 1 5 9 (diagonal)
Run Code Online (Sandbox Code Playgroud)

数组下标中的第一个;分隔字段[...]对应于数组中的第一个维度,即数组中的行.

指定*要包含所有行的方法,而不是指定特定的行.

最后一个字段对应于下标的叶子,即要访问的实际元素.

我首先尝试的只是$++而不是{$++}但是这给了我所有元素的第0列,大概是因为语言/ roast和/或Rakudo仅在下[...]标运算符的每次调用时评估标量索引值.

然后我推断如果索引是Callable,它将被调用,并且每行可能调用一次.这很有效.

我认为这与Rakudo中的此代码相对应.

乍一看,这似乎意味着你不能使用a Callable来计算叶片,我注意到"计算指数"烘焙切片不包括使用a Callable.也许我只是没有正确看待它.


jjm*_*elo 1

您可能已经看到,这会返回一个尚未实现的错误(插入该错误是为了解决此错误

Partially dimensioned views of shaped arrays not yet implemented. Sorry.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,最好只是取消数组的形状并使用更传统的方法:

use v6;

my @array = (
    < 1 2 3 >,
    < 4 5 6 >,
    < 7 8 9 >
    );

my @diagonal = gather {
    my @ends = ((0,0),(1,1),(2,2));
    for @ends -> @indices {
        take @array[ @indices[0] ][@indices[1]];
    };
}
say @diagonal;
Run Code Online (Sandbox Code Playgroud)

通过查看该主题的概要,我想说该方法并未真正指定。因此,当一切都说了又做了之后,您可能必须使用 或EVAL宏(当然,当它们最终实现时......)

  • 部分错误与您的任务“一切”有关,但绝对不清楚。本质上,原生形状数组尚不存在这种形式的下标。`&gt; 我的 @shape[3;3] = [&lt; 1 2 3 &gt;;&lt; 4 5 6 &gt;;&lt; 7 8 9 &gt;] [[1 2 3] [4 5 6] [7 8 9]] &gt; @shape [1;*] 形状数组的部分维度视图尚未实现。对不起。在 &lt;unknown file&gt; 第 1 行的 &lt;unit&gt; 块中 &gt; my @unshape = [&lt; 1 2 3 &gt;;&lt; 4 5 6 &gt;;&lt; 7 8 9 &gt;] [(1 2 3) (4 5 6) (7 8 9)] &gt; @unshape[1;*] (4 5 6)` (2认同)