Hack #100. Overload Your Operators
Make your objects look like numbers, strings, and booleans sensibly.
Few people realize that Perl is an operator-oriented language, where the behavior of data depends on the operations you perform on it. You've probably had the experience of inadvertently stringifying an object or reference and wondering where and why you suddenly see memory addresses.
Fortunately, you can control what happens to your objects in various contexts.
Consider the Number::Intervals module from "Track Your Approximations" [Hack #99]. It's useful, but as shown there it has a few drawbacks.
The effect of the import( ) subroutine is that any code that declares:
use Number::Intervals;
will thereafter have every floating-point constant replaced by a Number::Intervals object that encodes upper and lower bounds on the original constant. That impressive achievement (utterly impossible in most other programming languages) will, sadly, be somewhat undermined when you then write:
use Number::Intervals; my $avogadro = 6.02214199e23; # standard physical constant my $atomic_mass = 55.847; # atomic mass of iron my $mass = 100; # mass in grams my $count = int( $mass * $avogadro/$atomic_mass ); print "Number of atoms in $mass grams of iron = $count\\n";
The unfortunate result is:
$ perl count_atoms.pl
Number of atoms in 100 grams of iron = 99Iron atoms are heavy, but they're not that heavy. The correct answer is just a little over 1 million billion billion, so converting to intervals appears ...