¿Cómo puedo determinar el tipo de referencia bendecida en Perl?
reference types (3)
Probablemente no deberías hacer esto. El tipo subyacente de un objeto es un detalle de implementación con el que no debe meterse. ¿Por qué querrías saber esto?
En Perl, un objeto es solo una referencia a cualquiera de los tipos básicos de datos de Perl que han sido bendecidos en una clase en particular. Cuando utiliza la función ref () en una referencia no autorizada, se le indica a qué tipo de datos apunta la referencia. Sin embargo, cuando llamas a ref () en una referencia bendita, se te devuelve el nombre del paquete en el que se ha bendecido la referencia.
Quiero saber el verdadero tipo subyacente de la bendita referencia. ¿Cómo puedo determinar esto?
Y mi primer pensamiento sobre esto fue: "Los objetos en Perl siempre son referencias hash, entonces, ¿qué es el truco?"
Pero, Scalar :: Util :: reftype es la respuesta. Gracias por hacer la pregunta aquí.
Aquí hay un fragmento de código para probar esto ... (en caso de que sea útil para cualquiera).
$> perl -e ''use strict; use warnings "all"; my $x = [1]; bless ($x, "ABC::Def"); use Data::Dumper; print Dumper $x; print ref($x) . "/n"; use Scalar::Util "reftype"; print reftype($x) . "/n"''`
Salida:
$VAR1 = bless( [ 1 ], ''ABC::Def'' ); ABC::Def ARRAY
Scalar::Util::reftype()
es la solución más limpia. El módulo Scalar::Util
se agregó al núcleo de Perl en la versión 5.7, pero está disponible para versiones anteriores (5.004 o posterior) de CPAN.
También puede probar con UNIVERSAL::isa()
:
$x->isa(''HASH'') # if $x is known to be an object
UNIVERSAL::isa($x, ''HASH'') # if $x might not be an object or reference
Obviamente, también debería verificar los tipos ARRAY
y SCALAR
. El módulo UNIVERSAL (que sirve como la clase base para todos los objetos) ha sido parte del núcleo desde Perl 5.003.
Otra forma, fácil pero un poco sucia, es codificar la referencia. Suponiendo que la clase no ha sobrecargado la cadena, obtendrá algo parecido a Class=HASH(0x1234ABCD)
, que puede analizar para extraer el tipo de datos subyacente:
my $type = ($object =~ /=(.+)/(0x[0-9a-f]+/)$/i);