Frage

In Perl ist ein Objekt lediglich eine Referenz auf einen der grundlegenden Perl-Datentypen, der einer bestimmten Klasse zugewiesen wurde.Wenn Sie die Funktion ref() für eine nicht gesegnete Referenz verwenden, wird Ihnen mitgeteilt, auf welchen Datentyp die Referenz verweist.Wenn Sie jedoch ref() für eine gesegnete Referenz aufrufen, wird Ihnen der Name des Pakets zurückgegeben, in das die Referenz gesegnet wurde.

Ich möchte den tatsächlichen zugrunde liegenden Typ der gesegneten Referenz wissen.Wie kann ich das feststellen?

War es hilfreich?

Lösung

Scalar::Util::reftype() ist die sauberste Lösung.Der Scalar::Util Das Modul wurde dem Perl-Kern in Version 5.7 hinzugefügt, ist aber für ältere Versionen (5.004 oder höher) von CPAN verfügbar.

Sie können auch mit sondieren 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

Natürlich müssten Sie auch nachsehen ARRAY Und SCALAR Typen.Das UNIVERSAL-Modul (das als Basisklasse für alle Objekte dient) ist seit Perl 5.003 Teil des Kerns.

Eine andere Möglichkeit – einfach, aber etwas schmutzig – besteht darin, die Referenz zu stringifizieren.Vorausgesetzt, dass die Klasse die Stringifizierung nicht überlastet hat, erhalten Sie etwas Ähnliches zurück Class=HASH(0x1234ABCD), das Sie analysieren können, um den zugrunde liegenden Datentyp zu extrahieren:

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

Andere Tipps

Das sollten Sie wahrscheinlich nicht tun.Der zugrunde liegende Typ eines Objekts ist ein Implementierungsdetail, mit dem Sie sich nicht herumschlagen sollten.Warum willst du das wissen?

Und mein erster Gedanke dazu war:„Objekte in Perl sind immer Hash-Refs, also was zum Teufel?“

Aber Scalar::Util::reftype ist die Antwort.Vielen Dank, dass Sie die Frage hier gestellt haben.

Hier ist ein Codeausschnitt, um dies zu beweisen.(falls es für irgendjemanden von Nutzen ist).

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

Ausgabe:

$VAR1 = bless( [
                 1
               ], 'ABC::Def' );
ABC::Def
ARRAY
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top