2016-03-14 49 views
8

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

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

回答

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; 
+0

我不明白为什么'我的($第一)= 1,2,3'; *确实*按预期工作。这个单一的论据不应该在那里适用吗?换句话说,这与'(我的第一个)= 1,2,3;'或'我的$第一; ($ first)= 1,2,3;'? – mscha

+0

@mscha:parens在语法上被重载:它们被用作声明语法的一部分以及为普通列表分隔(可能碰巧包含可分配的东西);从语法上看,它可能看起来很相似,但语义上,苹果和桔子 – Christoph

+0

@mscha:为了一致性,使规则相同可能是一个好主意,但是请注意,列表语法是在Perl6的相当漫长的开发过程中演变而来的 – Christoph

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␤» 
相关问题