Es por esto que, para operaciones no conmutativas como la resta o la divisón, la función de implementación suele comenzar asi:
sub bsub {
  my ($op1, $op2, $reversed) = @_;
  ($op1, $op2) = ($op2, $op1) if $reversed;
  if (UNIVERSAL::isa($op1, 'Math::BigFloat') { 
    ... # $op1 es un objeto
  }
  ...
}
Veamos otro ejemplo, en el que el objeto esta a la derecha y 
a la izquierda tenemos una constante:
$ cat ./bigfloat3.pl
#!/usr/bin/perl -d
use strict;
use Math::BigFloat;
my $a = Math::BigFloat->new('123_456_789_123_456_789');
print "123_456_789_123_456_789-a = ",'123_456_789_123_456_789'-$a,"\n";
Al ejecutar, tenemos:
$ ./bigfloat3.pl
main::(./bigfloat3.pl:5):       my $a = Math::BigFloat->new('123_456_789_123_456_789');
  DB<1> n
main::(./bigfloat3.pl:7):       print "123_456_789_123_456_789-a = ",'123_456_789_123_456_789'-$a,"\n";
  DB<1> s
Math::BigInt::CODE(0x82f997c)(/usr/share/perl5/Math/BigInt.pm:47):
47:     '-'     =>      sub { my $c = $_[0]->copy; $_[2] ?
48:                        $c->bneg()->badd($_[1]) :
49:                        $c->bsub( $_[1]) },
  DB<1> p "@_"
123456789123456789 123_456_789_123_456_789 1
Vemos como el tercer argumento esta a 1 y como la subrutina anónima
que trata el caso del menos binario convierte la expresión $a-$b
en (-$b)+$a en el caso en que el objeto es el segundo término.
Continuamos la ejecución:
DB<2> c 123_456_789_123_456_789-a = 0 Debugged program terminated. Use q to quit or R to restart, use O inhibit_exit to avoid stopping after program termination, h q, h R or h O to get additional info.Observe que, en general se espera que los operadores sobrecargados puedan manejar la operación de números y objetos de la clase como en
4+$a. Por tanto nuestro código debe manipular no solo
la operación de objetos sino también la de objetos y números. El ejemplo anterior del método
substract, a través del uso del método UNIVERSAL::isa 
(véase sección 6.6) muestra una forma de hacerlo.
Casiano Rodríguez León
