![]() |
printing code references
how do i print the name of the subroutine to which a code ref points?
#!/opt/vdops/bin/perl use strict; use warnings; my $ref; $ref = \&foo; print "&$ref\n"; sub foo { # Do nothing } guru% ./test &CODE(0x815bed0) guru% I would like to see "&foo" instead of "&CODE(0x815bed0)". --sk stuart kendrick fhcrc |
Re: printing code references
Stuart Kendrick <skendric@fhcrc.org> wrote in comp.lang.perl.misc:
> how do i print the name of the subroutine to which a code ref points? > > #!/opt/vdops/bin/perl > use strict; > use warnings; > > my $ref; > $ref = \&foo; > print "&$ref\n"; > > sub foo { > # Do nothing > } > > guru% ./test > &CODE(0x815bed0) > guru% > > > I would like to see "&foo" instead of "&CODE(0x815bed0)". You can't. A sub can be anonymous, it can also be reachable through more than one name. In the first case, there simply is no name, in the second, which one should it print? When a sub is called, the name though which it has been called is available through the caller() function, but that's doesn't help with a static coderef. Short of a comprehensive search through all packages, there is no way to determine if a coderef has names. (It can be done, and since it can be done, there must be a module...) Anno |
Re: printing code references
Anno Siegel <anno4000@lublin.zrz.tu-berlin.de> wrote:
>Stuart Kendrick <skendric@fhcrc.org> wrote in comp.lang.perl.misc: >> >> I would like to see "&foo" instead of "&CODE(0x815bed0)". > >You can't. A sub can be anonymous, it can also be reachable through >more than one name. In the first case, there simply is no name, in >the second, which one should it print? You can, actually - the debugger manages it. It just makes up a name for anon subs: DB<1> sub a { print "Hello" } DB<2> $a = \&a DB<3> x $a 0 CODE(0x31f178) -> &main::a in (eval 6)[/home/mjtg/perl-5.8.1-RC4/lib/perl5db.pl:618]:2-2 DB<4> $a = sub { print "Goodbye" } DB<5> x $a 0 CODE(0x336c30) -> &main::__ANON__[(eval 10)[/home/mjtg/perl-5.8.1-RC4/lib/perl5db.pl:618]:2] in (eval 10)[/home/mjtg/perl-5.8.1-RC4/lib/perl5db.pl:618]:2-2 DB<6> To see how the trick is performed, rummage in the source of the debugger. Mike Guy |
| All times are GMT. The time now is 06:20 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.