ikegami -
From a formal point of view there is, of course, a huge difference between calling a subroutine or using an operator - even if the difference is not discernable in Perl from their surface strings as you illustrate (other programming languages, of course, choose to handle this differently). I am not talking about how the input and output data get shifted around in memory here. The main difference from a formal perspective is that
operators are part of the language inventory (its lexicon, to be precise) while
subroutines are user-defined constructs based on language inventory and hence do not belong to the inventory themselves. As a result, operators may have additional properties - such as side-effects - associated with them by definition while subroutines do and cannot (as far as I am aware I cannot define side-effects for a subroutine in Perl).
To come up with a uniform argument on the production of side-effects by Perl commands (
not statements!) one may wish to argue that the side-effect of a subroutine call is identical to its return value ... this behaviour would permit (the meaningful?) generalisation that every construct in Perl involving an operator (be it Perl-internal or user-defined) and its operands returns its return value plus one or more side-effect(s).