2 Stimmen

Perl: Wie kann man durch die Symboltabelle iterieren, um alle geladenen Unterklassen von Foo::Bar zu finden?

Ich habe ein Modul, das Ausnahmen für das Paket definiert, von dem es ein Teil ist. Die Ausnahmen werden deklariert mit Exception::Class::Nested .

Für die Zwecke der Diskussion nehmen wir an, dass dieses Modul den Namen Foo::Bar::Exception und dass alle darin definierten Ausnahmen Unterklassen der ersten Ebene dieser Klasse sind ( z.B.. , Foo::Bar::Exception:DoNotDoThat ). Alle Ausnahmen, die mich interessieren, sind in dieser Moduldatei definiert; ich bin nicht daran interessiert, dass ein anderes Modul zusätzliche Unterklassen für mich erstellt.

Für meine import Methode möchte ich eine Liste aller definierten Ausnahmen erstellen, und ich möchte dies tun, indem ich die Symboltabelle irgendwie durchlaufe, anstatt eine hart kodierte Liste zu führen, die nicht mehr mit den Definitionen übereinstimmen kann und manuell gepflegt werden muss.

Wie können also Foo::Bar::Exception->import iterativ durchlaufen Foo::Bar::Exception Symboltabelle alle Ausnahmen (Unterklassen der ersten Ebene) finden, die im Modul deklariert wurden? Es ist nur die aktiv geladene Symboltabelle, an der ich interessiert bin; keine Dateisystem-Suche oder ähnliches.

Gracias.

[ Nachtrag ]

Da alle Namen meiner Ausnahme-Unterklassen mit Exception ou Error Das sieht so aus, als käme es dem nahe, was ich will:

my %symtable = eval("'%' . __PACKAGE__ . '::'");
my @shortnames = grep(m!(?:Error|Exception)::$!, keys(%symtable));
@shortnames = ( map { $_ =~ s/::$//; $_; } @shortnames );
my @longnames = ( map { __PACKAGE__ . '::' . $_ } @shortnames );

Einige der Klammerungen sind unnötig, aber ich habe sie hinzugefügt, um den Kontext des Arrays zu verdeutlichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X