Sub::Identify - Wie bitte heisst das Unterprogramm auf welches diese Coderefenz verweist?
Veröffentlicht von Thomas Fahle am (Permalink)
Mit Sub::Identify - Retrieve names of code references von Rafaël Garcia-Suarez lässt sich sehr einfach der Name des Unterprogramms ermitteln, auf den sich eine Code-Referenz bezieht.
Beispiel
Zunächst wird ein einfaches package namens XYZ erstellt. Dieses ansonsten weitgehend sinnfreie Package gibt aus dem Unterprogramm greeting eine Code-Referenz auf eines der beiden Unterprogramme hallo oder hello zurück. Der Aufrufer von greeting kann aber nicht ohne weiteres erkennen, auf welches der beiden Unterprogramme eine Referenz zurückgeben wird.
package XYZ; use strict; use warnings; use Exporter; our @ISA = qw/ Exporter /; our @EXPORT = (); our @EXPORT_OK = qw/ greeting/; our $VERSION = '0.01'; ########################################################### sub hello { print "Hello\n" }; ########################################################### sub hallo { print "Hallo\n" }; ########################################################### sub greeting { my $lang = shift @_; # Das passende Unterprogramm waehlen my $greet = $lang eq 'de' ? \&hallo : \&hello; # und als Code-Referenz zurueckgeben return $greet; } ########################################################### sub VERSION { return $VERSION; } ########################################################### 1; __END__
Dank Sub::Identify lässt sich nun sehr einfach der Name des Unterprogramms ermitteln, auf den sich die Code-Referenz bezieht.
#!/usr/bin/perl use strict; use warnings; use Sub::Identify ':all'; use XYZ qw/greeting/; # Code-Referenzen holen my $de = greeting('de'); my $en = greeting('en'); # und ausfuehren $de->(); $en->(); identify($de); identify($en); ########################################################### sub identify { my $coderef = shift @_; my $subname = sub_name( $coderef ); my $p = stash_name( $coderef ); my $fully_qualified_name = sub_fullname( $coderef ); defined $subname ? print "This coderef points to sub $subname in package $p\n" : print "oops\n"; } ###########################################################
Das Programm erzeugt folgende Ausgabe:
Hallo Hello This coderef points to sub hallo in package XYZ This coderef points to sub hello in package XYZ
Bei anonymen Code-Referenzen gibt sub_name entsprechend __ANON__ zurück.