2016-03-14 5 views
8

サブから返されたリストから2つの値を保存し、3番目の値をスローするには、次のようにします。変数リストへの代入が一貫しないのはなぜですか?

(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); 
をお読みください

また、右側の括弧も余分なものであることに注意してください(それはリスト構築を行うコンマです)。より多くの慣用的なバージョンでは、コンテナのリストにリスト(またはその一部)を割り当て、あなたの最初の例では

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

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

「my($ first)= 1,2,3'; *は意図したとおりに動作します。一つの議論はそこにも適用されるべきではありませんか?言い換えれば、これは '(my $ first)= 1,2,3;または' my $ first;とはどう違うのですか? ($ first)= 1,2,3; '? – mscha

+0

@mscha:括弧は構文上オーバーロードされています:宣言構文の一部として使用され、通常のリストを区切るために使用されます(割り当て可能なものが含まれることがあります)。構文的には類似しているかもしれませんが、意味的にはリンゴとオレンジのように見えます – Christoph

+0

@mscha:一貫性のために、ルールを同じにすることは良い考えですが、Perl6のかなり長い開発プロセス – Christoph

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

だろう。 2番目の例は、あなたが求めているものとまったく同じです。値のリストは1つのコンテナに割り当てられます。 Perl 5では、リストは括弧(この場合は)で構成されているため、Perl 6ではリストがコンマで構成されます。後者は私の例では何が求められるのかを知るために使われています。

私は、リストがコンマ、かっこ、またはかっこで構成されていることがあるため、Perl 5は矛盾していると主張します。

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

匿名の状態変数を追加することで、1つまたは複数のリスト要素をスキップできます。これは、最初の例へのショートカットにもつながります。

my $first,$ = 1,2,3; 
dd $first; # OUTPUT«Any $first = Any␤» 
関連する問題