Subroutinennamen über Referenz finden

Subroutinennamen über Referenz finden

am 22.05.2006 17:56:53 von KWittrock

Hallo,

in einer Schleife rufe ich mehrere Subs über ein Array von Referenzen auf.
Wenn mir das Resultat einer Sub nicht gefällt (was die Sub nicht wissen
kann), gebe ich eine Meldung aus. In der Meldung möchte ich auch den Namen
der Sub angeben.

Klar, ich kann dafür sorgen, dass jede Sub Ihren Namen in einer globalen
Variablen hinterlegt. Das finde ich aber nicht sonderlich elegant. Kann ich
auch direkt über die Referenz an den Namen herankommen?

Gruß

Klaus

Re: Subroutinennamen überReferenz finden

am 22.05.2006 18:48:16 von Christian Lackas

* K. Wittrock [2006-05-22]:

Hallo Klaus,

> Klar, ich kann dafür sorgen, dass jede Sub Ihren Namen in einer globalen
> Variablen hinterlegt. Das finde ich aber nicht sonderlich elegant. Kann ich
> auch direkt über die Referenz an den Namen herankommen?

warum speicherst du die Referenzen nicht einfach in einem Hash statt in
einem Array. Dann hast du den Namen automatisch mit dabei. Es gibt auch
Hash Versionen, die sortiert bleiben fallst du das brauchst (-> CPAN).

Ansonsten sieht dein Anliegen eher schlecht aus. Eine Referenz kennt ja
den Namen einer Variable oder einer Funktion nicht. Kann ihn auch gar
nicht eindeutig kennen, da diese ja gar keinen Namen zu haben braucht,
oder auch mehrere haben kann.

Gruss
Christian

--
Gegen Angriffe kann man sich wehren, gegen Lob ist man machtlos.
(Sigmund Freud, österr. Psychologe & Psychater, 1856-1939)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker

Re: Subroutinennamen über Referenz finden

am 22.05.2006 18:55:18 von Frank Seitz

K. Wittrock wrote:

> in einer Schleife rufe ich mehrere Subs über ein Array von Referenzen auf.
> Wenn mir das Resultat einer Sub nicht gefällt (was die Sub nicht wissen
> kann), gebe ich eine Meldung aus. In der Meldung möchte ich auch den Namen
> der Sub angeben.
>
> Klar, ich kann dafür sorgen, dass jede Sub Ihren Namen in einer globalen
> Variablen hinterlegt. Das finde ich aber nicht sonderlich elegant. Kann ich
> auch direkt über die Referenz an den Namen herankommen?

Sub::Identify

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Subroutinennamen über Referenz finden

am 22.05.2006 19:05:11 von Ferry Bolhar

Klaus Wittrock:

> in einer Schleife rufe ich mehrere Subs über ein Array von Referenzen auf.
> Wenn mir das Resultat einer Sub nicht gefällt (was die Sub nicht wissen
> kann), gebe ich eine Meldung aus. In der Meldung möchte ich auch den Namen
> der Sub angeben.

Von Perl direkt weiß ich nicht, ob es geht, aber mit dem B-Modul geht es auf
alle Fälle:

Angenommen, $subref enthalte die Referenz auf deine Subroutine, dann kannst
du mit

use B:

$name = B::svref_2object($subref)->GV->NAME;

deren Namen erhalten. Handelt es sich um eine Referenz auf eine anonyme
Subroutine, so erhälst du den String "__ANON__".

HTH & Schöne Grüße aus Wien,

Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: Subroutinennamen über Referenz finden

am 23.05.2006 11:26:14 von KWittrock

"Ferry Bolhar" schrieb im Newsbeitrag
news:1148317511.951859@proxy.dienste.wien.at...
......
>
> Angenommen, $subref enthalte die Referenz auf deine Subroutine, dann
> kannst
> du mit
>
> use B:
>
> $name = B::svref_2object($subref)->GV->NAME;
>
> deren Namen erhalten.

Danke, funktioniert prima.

Klaus

Re: Subroutinennamen über Referenz finden

am 23.05.2006 16:02:22 von f.ballandt

K. Wittrock schrieb:

Hallo,

ich erweitere mal:

Ich hätte gern zur Laufzeit ein Array der Namen aller verfügbaren subs
(ggfs. nach eingebundenen Modulen getrennt).

Kann das jemand liefern?

Frank

Re: Subroutinennamen überReferenz finden

am 23.05.2006 16:27:45 von Daniel Fischer

f.ballandt!

> Ich hätte gern zur Laufzeit ein Array der Namen aller verfügbaren subs
> (ggfs. nach eingebundenen Modulen getrennt).

use Devel::Symdump;

$s = Devel::Symdump->rnew;
print join "\n", $s->functions, '';

sub blabla {
}

sub blubb {
}



Gruß
Daniel

Re: Subroutinennamen über Referenz finden

am 23.05.2006 16:48:48 von Ch Lamprecht

f.ballandt schrieb:
> K. Wittrock schrieb:
>
> Hallo,
>
> ich erweitere mal:
>
> Ich hätte gern zur Laufzeit ein Array der Namen aller verfügbaren subs
> (ggfs. nach eingebundenen Modulen getrennt).
>
> Kann das jemand liefern?
>
> Frank
Hallo,
Hier sind mal alle Funktionen eines Pakets:


sub get_functions{
my ($class) = @_;
print "g_m called for $class\n";


no strict 'refs';
my @list;
my $s_t_r = \%{$class."::"};
use strict ;
foreach my $key ( keys %$s_t_r) {
my $var = \ ( $s_t_r->{$key} );
my $state;
ref $var eq 'GLOB' && *{$var}{CODE} && ($state = 'declared')
&& defined &{*{$var}{CODE}} && ($state = 'defined');
ref $var eq 'SCALAR' && $$var == -1 && ($state = 'declared');
if ($state) {
push @list , [$key,$state,$class];
}
}
@list = sort {lc $a->[0]cmp lc $b->[0]} @list;

return \@list;
}


Chtistoph

--

perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"