В большинстве языков порядок оценки операндов для большинства операторов не определен или, по крайней мере, недокументирован. [1] Perl не является исключением.
f() + g()
вызывает f()
или g()
первый? Ну, это недокументировано и предположительно не определено.
Теперь получается, что perl
в настоящее время очень непротиворечиво. Бинарные арифметические операторы всегда будут оценивать свой левый операнд перед правым операндом (включая **
, который является ассоциативным справа), в то время как скалярный оператор присваивания и оператор присвоения списка оценивают свой операнд RHS перед своим операндом LHS.
Заметные исключения включают оператор запятой в скалярном контексте и операторы короткого замыкания.
Оператор запятой в скалярном контексте задокументирован для оценки его LHSдо его RHS, хотя такая гарантия не предоставляется, когда она вызывается в контексте списка.
Операторы короткого замыкания - а именно &&
, ||
, and
, or
и условный оператор - должныобязательно оцените их LHS перед любым другим операндом.