Vra

In Perl, 'n voorwerp is net 'n verwysing na enige van die basiese Perl datatipes wat is geseën in 'n bepaalde klas. Wanneer jy die funksie ref () gebruik op 'n ongeseënde verwysing, is jy vertel tipe wat data die verwysingspunte om. Maar wanneer jy ref () 'n beroep op 'n geseënde verwysing, jy is terug die naam van die pakket wat is vindplaats geseën in.

Ek wil weet die werklike onderliggende tipe van die geseënde verwysing. Hoe kan ek dit vas te stel?

Was dit nuttig?

Oplossing

Scalar::Util::reftype() is die skoonste oplossing. Die Scalar::Util module is bygevoeg om die Perl kern in weergawe 5.7, maar is beskikbaar vir ouer weergawes (5,004 of later) van CPAN.

Jy kan ook ondersoek met 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

Dit is duidelik dat, sou jy ook moet kyk vir ARRAY en SCALAR tipes. Die universele module (wat dien as die basis klas vir al die voorwerpe) het deel van die kern sedert Perl 5,003.

Nog 'n manier - maklik, maar 'n bietjie vuil - is om die verwysing stringify. Veronderstelling dat die klas nie oorlaai stringification jy terug kry iets wat lyk soos Class=HASH(0x1234ABCD), wat jy kan ontleed om die onderliggende tipe data te onttrek:

my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);

Ander wenke

Jy moet waarskynlik nie doen nie. Die onderliggende tipe van 'n voorwerp is 'n implementering detail wat jy moet nie gemors met. Waarom sou jy wil om dit te verstaan?

En my eerste gedagte op hierdie was: "voorwerpe in Perl is altyd hash refs, so wat die hack"

Maar, Skalaar :: Util :: reftype is die antwoord. Dankie vir die plaas van die vraag hier.

Hier is 'n kode uit om dit te bewys .. (in geval dit 'n saak van gebruik om iemand).

$> 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"'`

Uitgawe:

$VAR1 = bless( [
                 1
               ], 'ABC::Def' );
ABC::Def
ARRAY
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top