$ cat -n ./fractions2.pl 1 #!/usr/local/bin/perl5.8.0 -w 2 use Number::Fraction ':constants'; 3 4 my $t = '1/2'; 5 my $x = $t; 6 $t += '1/2'; 7 print "t=$t, ref(t)=",ref($t),"\n"; 8 print "x=$x, ref(x)=",ref($x),"\n";Al ejecutarlo, produce la siguiente salida:
$ ./fractions2.pl t=1/1, ref(t)=Number::Fraction x=1/2, ref(x)=Number::Fraction¿Porqué la asignación de la línea 5 (
$x = $t
) no parece comportarse como
una asignación de referencias como se señaló en la sección anterior?.
La modificación de $t
no produce un efecto lateral sobre $x
.
Nótese que el operador =
no ha sido sobrecargado en Number::Fraction
.
Puede comprobarlo en el listado de la cabecera de Number::Fraction
que aparece en la sección 7.8.6.
Para ayudar a entender lo que esta ocurriendo, aqui tiene el código del método
add
que sobrecarga el operador +
sub add { my ($l, $r, $rev) = @_; if (ref $r) { if (UNIVERSAL::isa($r, ref $l)) { return (ref $l)->new($l->{num} * $r->{den} + $r->{num} * $l->{den}, $r->{den} * $l->{den}); } else { croak "Can't add a ", ref $l, " to a ", ref $l; } } else { if ($r =~ /^[-+]?\d+$/) { return $l + (ref $l)->new($r, 1); } else { return $l->to_num + $r; } } }