为什么分配给变量列表不一致?

Why is assignment to a list of variables inconsistent?

要从子返回的列表中保存 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;

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

这应该是由于 single argument rule。您可以通过添加尾随 ,:

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

请注意,虽然这作为声明 return 容器工作,它们是第一个 class 可以放入列表的对象,但您仍然在这样做 'wrong':

作业应为

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

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

另请注意,右侧的括号也是多余的(它是用于列表构造的逗号);更惯用的版本是

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

my ($first) = 1, 2, 3;
(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␤»