我想知道如何完全展平列表和包含它们的东西.除此之外,我想出了这个解决方案,它可以滑动具有多个元素的东西并将它们放回去,或者在滑动之后用一个元素取出它.
这与我如何"压扁"perl 6中的列表列表略有不同?,这是完全平坦的,因为任务是重组.
但是,也许有更好的方法.
my @a = 'a', ('b', 'c' );
my @b = ('d',), 'e', 'f', @a;
my @c = 'x', $( 'y', 'z' ), 'w';
my @ab = @a, @b, @c;
say "ab: ", @ab;
my @f = @ab;
@f = gather {
while @f {
@f[0].elems == 1 ??
take @f.shift.Slip
!!
@f.unshift( @f.shift.Slip )
}
}
say "f: ", @f;
Run Code Online (Sandbox Code Playgroud)
这给出了:
ab: [[a (b c)] [(d) e f [a (b c)]] [x …Run Code Online (Sandbox Code Playgroud) 平面多维数组的最短方法是什么?
以下是我的意思的一些例子:
# 2D array
my @a = [1,2],[3,4];
say @a».Slip.flat; # prints (1 2 3 4)
# 3D array
my @b = [[1,2],[3,4]],[[5,6],[7,8]];
say @b».Slip».flat».Slip.flat; # prints (1 2 3 4 5 6 7 8)
# but needs to know how many dimensions
# there are to flatten
Run Code Online (Sandbox Code Playgroud)
是否有可能以递归方式展平数组数组,例如@b不写入以递归方式下降到其中的子数据或者对其维数的数量有任何了解?
我问这个是因为我相信编译器(现在或将来的实现)能够优化基于操作员的解决方案而不是sub.
我有两个元素的列表的列表,就像你用得到的,例如(1..5) Z (20..24),我要制作成一个哈希(在这个例子中,你通过得到什么{1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}。我能做到“手”,但ISN不太优雅,我相信 Raku 有一种惯用的方法。我想出的不优雅的替代方案是:
my @a = (1..5) Z (20..24);
my %a;
for @a -> @x {
%a{@x[0]} = @x[1];
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个按键或值查找的哈希.要查找两种方式,我希望值为键(值为键).
<
H He
>
==> map( {
state $n = 0; $n++;
$n => $_.Str,
$_.Str => $n
} )
==> my %elements;
%elements.perl.say;
%elements{2}.WHAT.say;
Run Code Online (Sandbox Code Playgroud)
这给了我这个奇怪的事情:
{"1\tH H\t2" => $(2 => "He", :He(2))}
(Any)
Run Code Online (Sandbox Code Playgroud)
只有一对,没关系:
<
H He
>
==> map( {
state $n = 0; $n++;
$n => $_.Str
} )
==> my %elements;
%elements.perl.say;
%elements{2}.WHAT.say;
Run Code Online (Sandbox Code Playgroud)
现在我得到了我想要的东西,但没有反向对:
{"1" => "H", "2" => "He"}
(Str)
Run Code Online (Sandbox Code Playgroud) 我想知道在 Raku 中有一种简洁的方法来处理嵌套数组(数组数组)并将结果展平吗?当转换平面数组>>.很方便时,但如果我想返回数组并且结果应该是平面的,那么 Raku 中可以使用什么构造?
grammar g {
rule port { <pnamelist> + %% ","}
token pnamelist { <id> + }
token id { \w }
}
class a {
method port ($/) { make $<pnamelist>>>.made }
method pnamelist ($/) { make $<id>>>.made }
method id ($/ ) { make $/.Str }
}
my $r = g.parse("ab,cd", :rule('port'), :actions(a) ).made;
say $r; # [[a b] [c d]]
Run Code Online (Sandbox Code Playgroud)
上面的代码片段输出[[a b] [c d]],但是我真正想要的是[a b c d]. …
my @products = (
(name => "samsung s6" , price => "600"),
(name => "samsung s7" , price => "700"));
# for @products -> $x { say $x{"name"} ~ ": USD" ~ $x{"price"} };
# Desired output:
#
# samsung s6: USD600
# samsung s7: USD700
# Real output: An error:
#
# "Type List does not support associative indexing."
Run Code Online (Sandbox Code Playgroud)
我还想使用该.kv方法进行迭代, $key并且$val像这样:
for @products -> $x.kv -> $key,$val { say $x{$key} ~ " " ~ …Run Code Online (Sandbox Code Playgroud)