Sub::Identify - Wie bitte heisst das Unterprogramm auf welches diese Coderefenz verweist?

| | Kommentare (0)

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

Jetzt kommentieren

Über diese Seite

Diese Seite enthält einen einen einzelnen Eintrag von Thomas Fahle vom 2.04.09 9:15.

Lingua::ManagementSpeak - Dann klappt's auch mit dem Management ist der vorherige Eintrag in diesem Blog.

Talk: Perl in RPM-Land ist der nächste Eintrag in diesem Blog.

Aktuelle Einträge finden Sie auf der Startseite, alle Einträge in den Archiven.

Blog Roll

Powered by

Powered by Movable Type 5.2.10

Creative Commons-Lizenz

Creative Commons License
Dieses Weblog steht unter einer Creative Commons-Lizenz.