Question

En Perl, un objet est simplement une référence à l'un des types de données Perl de base qui ont été intégrés dans une classe particulière.Lorsque vous utilisez la fonction ref() sur une référence non bénie, on vous indique à quel type de données la référence pointe.Cependant, lorsque vous appelez ref() sur une référence bénie, vous obtenez le nom du package dans lequel la référence a été bénie.

Je veux connaître le type sous-jacent réel de la référence bénie.Comment puis-je déterminer cela ?

Était-ce utile?

La solution

Scalar::Util::reftype() est la solution la plus propre.Le Scalar::Util Le module a été ajouté au noyau Perl dans la version 5.7 mais est disponible pour les anciennes versions (5.004 ou ultérieures) auprès du CPAN.

Vous pouvez également sonder avec 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

Évidemment, vous devrez également vérifier ARRAY et SCALAR les types.Le module UNIVERSAL (qui sert de classe de base pour tous les objets) fait partie du noyau depuis Perl 5.003.

Une autre méthode - simple mais un peu sale - consiste à stringifier la référence.En supposant que la classe n'a pas surchargé la stringification, vous obtiendrez quelque chose qui ressemble à Class=HASH(0x1234ABCD), que vous pouvez analyser pour extraire le type de données sous-jacent :

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

Autres conseils

Vous ne devriez probablement pas faire ça.Le type sous-jacent d'un objet est un détail d'implémentation avec lequel vous ne devriez pas jouer.Pourquoi voudriez-vous savoir cela ?

Et ma première pensée à ce sujet a été :"Les objets en Perl sont toujours des références de hachage, alors c'est quoi ce hack ?"

Mais Scalar::Util::reftype est la réponse.Merci d'avoir posé la question ici.

Voici un extrait de code pour le prouver.(au cas où cela servirait à quelqu'un).

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

Sortir:

$VAR1 = bless( [
                 1
               ], 'ABC::Def' );
ABC::Def
ARRAY
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top