我想,结果应该是1, 2, 3
。
> my ($a, $b, $c)
> (($a, $b), $c) = ((1, 2), 3)
(((1 2) 3) (Any))
> $a, $b, $c
((1 2) 3 (Any))
这里有什么问题?
答案 0 :(得分:7)
没有任何错误(也就是说,P6中的普通任务是按照它的方式进行的),但是猜测你希望使双方的结构相同会导致$a
获得{ {1}},1
获得$b
和2
获得$c
。
为此,您需要“绑定赋值”(也称为“绑定”),而不是普通的赋值:
3
请注意左侧列表前的冒号,使其成为签名文字,并在my ($a, $b, $c);
:(($a, $b), $c) := ((1, 2), 3);
之前使用冒号,使其成为绑定操作。
答案 1 :(得分:5)
如果您希望结果为1, 2, 3
,则必须Slip
列表:
my ($a, $b, $c) = |(1, 2), 3;
这是单一参数规则的结果:https://docs.perl6.org/type/Signature#Single_Argument_Rule_Slurpy
这也是为什么这样做的原因:
my ($a, $b, $c) = (1, 2, 3);
尽管(1,2,3)
是一个包含3个元素的List
,但由于相同的单个参数规则,它将自动滑动。你当然也可以删除(迷信)括号:
my ($a, $b, $c) = 1, 2, 3;
答案 2 :(得分:2)
你在问*这里有什么问题",我会说the single argument rule的某些变体正在起作用。由于括号仅用于分组,所以正在进行的是这项任务
($a, $b), $c = (1, 2), 3
(1, 2), 3
表现为单个参数,因此它们可以轻松地分配给组中的第一个元素$a, $b
。因此,他们得到了所有,而旧$c
只获得任何。以这种方式看待它:
my ($a, $b, $c);
($a, ($b, $c)) = ((1, 2), 3, 'þ');
say $a, $c; # OUTPUT: «(1 2)þ»
您可能希望查看使用»=«
的{{3}},它正是您正在寻找的内容。这是this code by Larry Wall,所以你可能要稍等一下,直到它为止。