присвоение списка в скалярном контексте возвращает количество элементов на правой стороне:Список назначений в скалярном контексте
scalar(my ($hello, $there, $world) = (7,8)); #evaluates to 2
Почему оценить правую и производить 2, вместо недавно определенный список оценивается и возвращается 3?
Для меня, похоже, $hello
получает 7, $there
получает 8 и $world
получает undef
, то этот список вычисляется в скалярном контексте, что привело бы к 3, так как это число элементов в списке ($hello $there $world
). Это кажется странным мне, что контекст влияет на какую часть вычисленного выражения возвращается:
my $greeting = (($hello, $there, $world) = (7,8)); #2
my @greeting = (($hello, $there, $world) = (7,8));
my $greeting_length = @greeting; #3
Действительно, нет: если левый список был оценен в скалярном контексте, значение будет 'undef'. Список не является массивом. – darch
@ darch, Это не имеет смысла. '($ hello, $ there, $ world)' (и '(7,8)') не может выполняться в скалярном контексте в '($ hello, $ there, $ world) = (7,8)'. Назначение списка может вернуть 3, если захочет, но нет причин. – ikegami
Я отвечал именно на фразу «тогда [список ($ hello, $ there, $ world)] оценивается в скалярном контексте». Оцените 'my ($ h, $ t, $ w) = (7, 8, undef); скаляр ($ h, $ t, $ w) 'и видеть, что списки не являются массивами. – darch