El operador de sobrecarga bool se encarga de la conversión a valores lógicos.
La correspondiente subrutina será invocada en cualquier contexto en el que aparezca
el objeto de la clase y Perl espere un valor lógico.
Por ejemplo en el módulo Set::Scalar::Base debido a Jarkko Hietaniemi y que proporciona acceso al álgebra de conjuntos vemos la siguiente declaración:
use overload
'+' => \&_union_overload,
'*' => \&_intersection_overload,
'-' => \&_difference_overload,
'neg' => \&_complement_overload,
'%' => \&_symmetric_difference_overload,
'/' => \&_unique_overload,
'eq' => \&is_equal,
'==' => \&is_equal,
'!=' => \&is_disjoint,
'<=>' => \&compare,
'<' => \&is_proper_subset,
'>' => \&is_proper_superset,
'<=' => \&is_subset,
'>=' => \&is_superset,
'bool' => \&size;
Obsérvese como el manipulador para bool hace que
un conjunto en un contexto lógico devuelva su tamaño (\&size).
El siguiente ejemplo que usa Set::Scalar
ilustra este punto. Consideremos el
programa:
$ cat ./scalar_sets2.pl
#!/usr/local/bin/perl5.8.0 -d
use Set::Scalar;
$A = Set::Scalar->new('a'..'z');
print "$A\n" if $A;
Al ejecutarlo podemos contemplar como se llama a &size
para evaluar la condición if $A:
$ ./scalar_sets2.pl
Loading DB routines from perl5db.pl version 1.19
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
main::(./scalar_sets2.pl:4): $A = Set::Scalar->new('a'..'z');
DB<1> n
main::(./scalar_sets2.pl:6): print "$A\n" if $A;
DB<1> s
Set::Scalar::Base::size(/usr/local/lib/perl5/site_perl/5.8.0/Set/Scalar/Base.pm:123):
123: my $self = shift;
El comando T nos permite ver la pila de llamadas:
DB<1> T
$ = Set::Scalar::Base::size(ref(Set::Scalar), undef, '') called from file `./scalar_sets2.pl' line 6
DB<1>
Set::Scalar::Base::size(/usr/local/lib/perl5/site_perl/5.8.0/Set/Scalar/Base.pm:125):
125: return scalar keys %{ $self->{'elements'} };
DB<1> c
(a b c d e f g h i j k l m n o p q r s t u v w x y z)
Casiano Rodríguez León
