printing code references

S

Stuart Kendrick

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
 
A

Anno Siegel

Stuart Kendrick said:
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
 
M

M.J.T. Guy

Anno Siegel said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top