Domanda

In Perl, un oggetto è semplicemente un riferimento a uno qualsiasi dei tipi di dati Perl di base che è stato inserito in una particolare classe.Quando usi la funzione ref() su un riferimento non benedetto, ti viene detto a quale tipo di dati punta il riferimento.Tuttavia, quando chiami ref() su un riferimento benedetto, ti viene restituito il nome del pacchetto in cui è stato benedetto il riferimento.

Voglio conoscere l'effettivo tipo sottostante del riferimento benedetto.Come posso determinarlo?

È stato utile?

Soluzione

Scalar::Util::reftype() è la soluzione più pulita.IL Scalar::Util Il modulo è stato aggiunto al core Perl nella versione 5.7 ma è disponibile per le versioni precedenti (5.004 o successive) da CPAN.

Puoi anche sondare 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

Ovviamente dovresti anche verificare ARRAY E SCALAR tipi.Il modulo UNIVERSAL (che funge da classe base per tutti gli oggetti) fa parte del nucleo sin dal Perl 5.003.

Un altro modo, semplice ma un po' sporco, è quello di stringere il riferimento.Supponendo che la classe non abbia sovraccaricato la stringificazione, otterrai qualcosa di simile Class=HASH(0x1234ABCD), che puoi analizzare per estrarre il tipo di dati sottostante:

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

Altri suggerimenti

Probabilmente non dovresti farlo.Il tipo sottostante di un oggetto è un dettaglio di implementazione con cui non dovresti scherzare.Perché vorresti saperlo?

E il mio primo pensiero a riguardo è stato:"Gli oggetti in Perl sono sempre riferimenti hash, quindi che trucco?"

Ma Scalar::Util::reftype è la risposta.Grazie per aver posto la domanda qui.

Ecco uno snippet di codice per dimostrarlo..(nel caso possa servire a qualcuno).

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

Produzione:

$VAR1 = bless( [
                 1
               ], 'ABC::Def' );
ABC::Def
ARRAY
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top