Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6923[/thread]

Name einer Sub: aus Referenz lesen



<< >> 8 Einträge, 1 Seite
mordur
 2005-04-22 15:23
#54140 #54140
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

ich habe eine Referenz auf eine Subroutine.
Mit
Code: (dl )
print &{$subref};
erhalte ich natürlich das, was in der Methode passiert. Eigentlich will ich aber nur den Namen der Methode wissen, auf den die Referenz zeigt. Geht das überhaupt? Wie?
pq
 2005-04-22 15:49
#54141 #54141
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
vielleicht geht es mit den Devel::* oder B::* modulen, aber ein subref muss
ja nicht immer eine referenz auf eine named subroutine sein.
was soll denn z.B. bei
my $subref = sub { print "blubb" };
als name angezeigt werden?\n\n

<!--EDIT|pq|1114170630-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Taulmarill
 2005-04-22 15:54
#54142 #54142
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
mit Devel::Peek kann man sich das anzeigen lassen, allerdings is die ausgabe mehr für's debugging als für automatisierte verarbeitung.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Strat
 2005-04-22 16:08
#54143 #54143
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
mir ist kein weg bekannt... eine referenz zeigt ja nicht auf den namen von irgendwas, sondern auf die daten selbst, und von daher glaube ich nicht, dass es geht... es sei denn, du fuehrst die infos irgendwie mit, oder passt die subroutine an (z.B. wenn sie ohne parameter aufgerufen wird, dann gibt sie ihren namen zurueck)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sri
 2005-04-22 16:36
#54144 #54144
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Es geht, sofern dahinter wirklich eine named sub steckt, wir machen soetwas aehnliches in Catalyst.

Du kannst dir mit hilfe von B den COMP_STASH deiner coderef holen und dann die richtige symboltabelle nach dem passenden namen zur code addresse abgrasen.

Hier mal etwas pseudocode dazu.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub test { 1 }
my $code = \&test;
use B;
my $class = B::svref_2object($code)->STASH->NAME;
my $name = '';
for my $sym ( values %{ $class . '::' } ) {
   if ( *{$sym}{CODE} && *{$sym}{CODE} == $code ) {
       $name = *{$sym}{NAME};
   }
}
print "Name is $name\n";


Ist aber nicht wirklich was fuer anfaenger, und natuerlich undokumentiert. ;)\n\n

<!--EDIT|sri|1114173732-->
Taulmarill
 2005-04-22 17:20
#54145 #54145
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
oder man spart sich die schleife und die no strict refs ;)
Code: (dl )
print B::svref_2object($code)->GV->NAME
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
sri
 2005-04-22 17:37
#54146 #54146
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Taulmarill,22.04.2005, 15:20]oder man spart sich die schleife und die no strict refs ;)
Code: (dl )
print B::svref_2object($code)->GV->NAME
[/quote]
Sieht gut aus, ich meine aber es gab da einen Fall wo es nicht funktioniert...faellt mir aber jetz nich mehr ein, war also wohl nicht so tragisch. :)
sri
 2005-04-22 17:48
#54147 #54147
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok, is doch tragisch...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
*test = sub { 1 };
my $code = \&test;

print "taulmarill says: " . B::svref_2object($code)->GV->NAME . "\n";

use B;
my $class = B::svref_2object($code)->STASH->NAME;
my $name = '';
for my $sym ( values %{ $class . '::' } ) {
if ( *{$sym}{CODE} && *{$sym}{CODE} == $code ) {
$name = *{$sym}{NAME};
}
}
print "sri says: $name\n";
<< >> 8 Einträge, 1 Seite



View all threads created 2005-04-22 15:23.