为什么赋值变量列表不一致?

时间:2016-03-14 23:47:59

标签: perl6

要从sub返回的列表中保存2个值并抛出第三个值,可以;

(my $first, my $second) = (1, 2, 3);
print $first, "\n";
print $second, "\n";
exit 0;

并且它按预期工作(在perl5和perl6中)。如果你只想要第一个;

(my $first) = (1, 2, 3);
print $first, "\n";
exit 0;

...你得到了整个清单。这似乎违反直觉 - 为什么不一致?

2 个答案:

答案 0 :(得分:9)

这应归功于single argument rule。您可以通过添加尾随,

来获得预期的行为
(my $first,) = (1, 2, 3);

请注意,虽然这可以作为声明返回容器,它是可以放入列表的第一类对象,但你仍然做错了“

作业应该是

my ($first, $second) = (1, 2, 3);

my ($first) = (1, 2, 3);

另请注意,右侧的parens也是多余的(这是列表构建的逗号);更惯用的版本将是

my ($first, $second) = 1, 2, 3;

my ($first) = 1, 2, 3;

答案 1 :(得分:6)

(my $first, ) = (1,2,3);
dd $first; # OUTPUT«Int $first = 1␤»

在第一个示例中,您将列表(或其中一部分)分配给容器列表。你的第二个例子完全符合你的要求。将值列表分配给一个容器。在Perl 5中,列表由括号构成(在本例中),在Perl 6中,列表由逗号构成。在我的例子中使用后者来获取所要求的内容。

我认为它的Perl 5是不一致的,因为有时列表是用逗号,括​​号或括号构造的。

my ($first,$,$third) = (1,2,3);
dd $first, $third; # OUTPUT«Int $first = 1␤Int $third = 3␤»

您可以通过添加匿名状态变量来跳过一个或多个列表元素。这也导致了第一个示例的快捷方式。

my $first,$ = 1,2,3;
dd $first; # OUTPUT«Any $first = Any␤»