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.