2016-03-14 7 views
8

Чтобы сохранить 2 значения из списка, возвращаемого sub, и выбросить третий, можно;Почему присвоение списка переменных несовместимо?

(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: 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␤» 
Смежные вопросы