Overloadable Operators

You can only overload certain operators, which are shown in Table 13-1. The operators are also listed in the %overload::ops hash made available when you use overload, though the categorization is a little different there.

Table 13.1. Overloadable Operators

Category Operators
Conversion "" 0+ bool
Arithmetic + - * / % ** x . neg
Logical !
Bitwise & | ~ ^ ! << >>
Assignment += -= *= /= %= **= x= .= <<= >>= ++ --
Comparison == < <= > >= != <=> lt le gt ge eq ne cmp
Mathematical atan2 cos sin exp abs log sqrt
Iterative <>
Dereference ${} @{} %{} &{} *{}
Pseudo nomethod fallback =>

Note that neg, bool, nomethod, and fallback are not actual Perl operators. The five dereferencers, "", and + probably don't seem like operators either. Nevertheless, they are all valid keys for the parameter list you provide to use overload. This is not really a problem. We'll let you in on a little secret: it's a bit of a fib to say that the overload pragma overloads operators. It overloads the underlying operations, whether invoked explicitly via their "official" operators, or implicitly via some related operator. (The pseudo-operators we mentioned can only be invoked implicitly.) In other words, overloading happens not at the syntactic level, but at the semantic level. The point is not to look good. The point is to do the right thing. Feel free to generalize.

Note also that = does not overload Perl's assignment operator, as you might expect. That would not do the right thing. More on that later.

We'll start by discussing the conversion operators, not because they're the most obvious (they aren't), but because they're the most useful. Many classes overload nothing but stringification, specified by the "" key. (Yes, that really is two double-quotes in a row.)

When overloading an operator, try not to create objects with references to themselves. For instance,

use overload '+' => sub {
 bless [ \$_[0], \$_[1] ] };


This is asking for trouble, since if you say $animal += $vegetable, the result will make $animal a reference to a blessed array reference whose first element is $animal. This is a circular reference, which means that even if you destroy $animal, its memory won't be freed until your process (or interpreter) terminates. See "Garbage Collection, Circular References, and Weak References" in "References".