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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top