要从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;
...你得到了整个清单。这似乎违反直觉 - 为什么不一致?
答案 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 = 1Int $third = 3»
您可以通过添加匿名状态变量来跳过一个或多个列表元素。这也导致了第一个示例的快捷方式。
my $first,$ = 1,2,3;
dd $first; # OUTPUT«Any $first = Any»