まったく実践的じゃない質問です。

単なる好奇心からインクリメント演算子を何気なくいじって、結果がどうなるか試していました。

すると正負をひっくり返した場合にエラーが出る場合と出ない場合がありました。

+--+を前置した場合:

$ perl -E '$z = 3; say +--+$z;'
2

-++-を前置した場合:

$ perl -E '$z = 3; say -++-$z;'
Can't modify negation (-) in preincrement (++) at -e line 1, near "$z;"
Execution of -e aborted due to compilation errors.

どうしてこのような差が出るんでしょうか?

perlのバージョンは5.18.2、OSXの上で実行しています。


以下はMO=Deparseした時の出力です:

$ perl -MO=Deparse -E '$z = 3; say +--+$z;'
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
$z = 3;
say --$z;
-e syntax OK

$ perl -MO=Deparse -E '$z = 3; say -++-$z;'
Can't modify negation (-) in preincrement (++) at -e line 1, near "$z;"
-e had compilation errors.
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
$z = 3;
say -++(-$z);