Почему он оценивает правую часть и выдает 2, вместо того, чтобы вновь определенный список оценивался и возвращал 3?
Потому что именно так и должно определяться определение языка, потому что именно так решил Ларри Уолл.
Мне кажется, что $ hello получает 7, $ туда получает 8, а $ world получает
undef, тогда этот список оценивается в скалярном контексте
Нет, Perl не работает таким образом. Вы предполагаете, что скалярный контекст - это просто преобразование результата, который был бы получен в контексте списка, в скаляр путем подсчета количества элементов в результате списка, но это просто неправильно ... скалярный контекст означает, что операция (в этом случае присваивание) должно давать скалярный результат, и часто есть скалярные результаты, которые более полезны, чем просто число элементов в результате контекста списка, и которые варьируются от оператора к оператору ... вы должны проверить документацию за что скаляр производит; это не равномерно. Для назначения списка скалярное значение - это число элементов с правой стороны, потому что это гораздо более полезно, чем число получателей, которое является постоянным. например, if (($a, $b) = $s =~ /$re/)
истинно, если совпадение дало результаты, в отличие от того, чтобы всегда быть истиной, потому что есть два получателя.
Мне кажется странным, что контекст влияет на то, какая часть оцениваемого
выражение возвращается
В Perl есть куда более странные вещи. Это чувство странности происходит из-за несоответствия между моделями ... в этом случае ваше ожидание ортогональности и ваша вера в то, что «скалярный контекст» является оператором в списках, против прагматического дизайна Perl и реальности, что «скалярный контекст» устанавливает контекст , который определяет, какой результат произвести. Обратите внимание, что вы можете написать свои собственные функции, которые дают совершенно разные результаты в зависимости от контекста вызова.