Как уже отмечалось, основное назначение любого оператора, и в том числе простого, — изменение
состояния программы. В основном под этим понимается изменение значений переменных программы, поэтому
выражение в простом операторе должно вычисляться с побочным эффектом, который проявляется в изменении
значения некоторых переменных в программе при вычислении выражения. Мы помним, что основное предназначение
выражения — вычислить некоторую величину, а не изменить состояние программы. В большинстве языков
программирования присваивание переменной какого-либо значения является оператором, но в Perl это
операция, которую можно использовать в выражениях. Следовательно, в простом операторе выражение
должно содержать хотя бы одну операцию присваивания. Ее вычисление и приводит к «побочному эффекту».
В Perl есть еще две операции, приводящие к побочному эффекту, — это операции увеличения/уменьшения
на единицу (++, --). Других операций, вызывающих побочный эффект, нет, если не считать изменения
значения фактического параметра при обращении к подпрограмме. Приведем несколько простых операторов,
выполнение которых приводит к побочным эффектам:
$m = $n**2; — простое присваивание
$g += $t; — сложное присваивание
$n++; — увеличение значения переменной $n на единицу
--$n**2; — уменьшение значения переменной $n на единицу
Почему мы так настойчиво говорили о выражении с побочным эффектом? Дело в том, что простой
оператор Perl может содержать выражение и без побочного эффекта. Все равно он будет рассматриваться
интерпретатором как допустимый оператор, правда, не изменяющий состояния программы, а только
вычисляющий значение некоторого выражения. Однако если включен режим отображения интерпретатором
предупреждающих сообщений (установлен флаг -w при запуске интерпретатора или в сценарии используется
прагма use warnings:), то будет получено сообщение о бесполезности использования соответствующей
операции в void-контексте, что, согласитесь, в конечном счете справедливо. Например, при выполнении оператора
($n * $m) ** 4 + 6,
будет отображено сообщение:
Useless use of addition (+) in void context at ex05-01.pl line 4.
Обратите внимание, что в сообщении интерпретатора упоминается о последней выполненной операции в
выражении простого оператора.
ПРИМЕЧАНИЕ Подобное сообщение будет отображаться, даже если в сложном выражении без операции
присваивания присутствует операция увеличения/ уменьшения на единицу. Сообщение не отображается
только в случае выражения, составленного из одних операций уменьшения/увеличения на единицу значений
переменных, или выражения, в котором определена любая операция присваивания. Таким образом,
разработчики Perl информируют программиста о том, что он, может быть, забыл вставить операцию
присваивания в выражение.
Читатель спросит, какой прок в операторе, не выполняющем никакого действия. Его можно использовать
для задания возвращаемого пользовательской функцией значения. Забегая вперед, скажем, что если в
функции явно не задано обращение к функции
return( ),
определяющей возвращаемое значение, то по
умолчанию Perl считает таковым значение последнего вычисленного в теле подпрограммы оператора.
Именно это обстоятельство и используется многими программистами для задания возвращаемого значения:
sub mySub {
…
# последний оператор в теле подпрограммы
$condition = $true ? "Result1" : "Result2";
}
Последний оператор функции mySub вычисляет операцию выбора, результат выполнения которой и является
возвращаемым значением функции.