Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Perl Misc (http://www.velocityreviews.com/forums/f67-perl-misc.html)
-   -   printing code references (http://www.velocityreviews.com/forums/t887785-printing-code-references.html)

Stuart Kendrick 08-26-2004 05:10 PM

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

Anno Siegel 08-26-2004 05:55 PM

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

M.J.T. Guy 09-08-2004 04:49 PM

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.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57