El hash referenciado por $paper
en las líneas de la 6 a la 13
es bendecido en la línea 15 con el nombre de la clase.
1 sub new { 2 my $class = shift; 3 my ($identifier, $author, $publisher, $title, $year, $url) = @_; 4 $class->_incr_count(); 5 6 my $paper = { 7 _identifier => $identifier, 8 _author => $author, 9 _publisher => $publisher, 10 _title => $title, 11 _year => $year, 12 _url => $url 13 }; 14 15 bless $paper, $class; 16 }Esto establece un campo interno dentro de la representación interna del hash anónimo. En cierto sentido es
%$paper
quien es bendecido, no $paper
. La figura 6.1
ilustra este punto:
En la izquierda de la figura aparecen la referencia y el
referente antes de la bendición. En la parte de la derecha, después de ejecutar
bless $paper, $class
. Obsérvese que se ha añadido
una marca con el nombre de la clase-paquete que identifica la estructura
de datos como un objeto de esa clase.
Una vez que el dato apuntado por la referencia ha sido bendecido,
el operador ref aplicado a dicha referencia devuelve el
nombre del paquete (esto es, el nombre de la clase) en vez
de HASH
.
Una comprobación de que quien es bendecido es el dato referido no la referencia la da el siguiente código:
$obj = new Biblio::Doc(1, "Asimov", "Bruguera", "Los propios dioses", 1989, "unknown"); $obj2 = $obj; print "obj2 es un ",ref($obj2),"\n";
Se imprimirá que obj2 es un Biblio::Doc
La función reftype en Scalar::Util permite obtener el tipo básico subyacente al objeto:
DB<1> use Scalar::Util qw{reftype} DB<2> $x = bless {}, 'SomeClass' DB<3> p ref($x) SomeClass DB<4> p reftype($x) HASH
Casiano Rodríguez León