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.

Siehe auch

Weitere Posts