Como posso determinar o tipo de um abençoado de referência em Perl?
Pergunta
Em Perl, um objeto é apenas uma referência para qualquer um dos básicos Perl tipos de dados que tem sido abençoado em uma determinada classe.Quando você usa o ref() função em uma unblessed de referência, você disse que tipo de dados os pontos de referência para.No entanto, quando você chamar ref() em um abençoado referência, é retornado o nome do pacote que a referência tenha sido abençoado em.
Eu quero saber o real tipo subjacente do santíssimo referência.Como posso determinar isso?
Solução
Scalar::Util::reftype()
é a solução mais pura.O Scalar::Util
módulo foi adicionado para o Perl core na versão 5.7, mas está disponível para versões mais antigas (5.004 ou mais recente) do CPAN.
Você também pode sonda com 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, você também terá que verificar ARRAY
e SCALAR
tipos.O módulo UNIVERSAL (que serve de classe base para todos os objetos) tem sido parte do núcleo desde o Perl 5.003.
Outra forma -- fácil, mas um pouco sujo -- é stringify a referência.Considerando que a classe não tenha sobrecarregado stringification o que você terá algo parecido com Class=HASH(0x1234ABCD)
, o que você pode analisar para extrair o tipo de dados subjacente:
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);
Outras dicas
Provavelmente você não deve fazer isso.O tipo subjacente de um objeto é um detalhe de implementação que você não deve mexer.Por que você quer saber isso?
E meu primeiro pensamento foi:"Objetos em Perl são sempre hash árbitros, de modo que o hack?"
Mas, Escalar::Util::reftype é a resposta.Obrigado por colocar a questão aqui.
Aqui está um trecho de código para provar isso..(em caso de qualquer utilização, para qualquer um).
$> 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"'`
Saída:
$VAR1 = bless( [ 1 ], 'ABC::Def' ); ABC::Def ARRAY