in reply to Re: Devel::Symdump and symbol table woes
in thread Devel::Symdump and symbol table woes
Just a couple of notes as a I retrace my understanding of this behavior.
Here's some relevant text from perlref, section "Making References":
*foo{THING} returns undef if that particular THING hasn’t been used yet, except in the case of scalars. *foo{SCALAR} returns a reference to an anonymous scalar if $foo hasn’t been used yet. This might change in a future release.One consequence of this is that at the symbol-table level, the following two packages are indistinguishable:
... which I may demonstrate with some code of my own, once I come up with something convincing that navigates the sea of casting and dereferencing that is the Perl symbol table. So while I think I appreciate what broquaint is trying to get across, I don't think the above post addresses the "spirit" of the OP. I would agree with the as-yet unmade statement that Devel::Symdump is doing its best, but the underlying data is ambiguous, and so are the values returned from the module.{ package Foo; our $x = undef; our @x = qw( alpha beta gamma ); } { package Bar; our @x = qw( alpha beta gamma ); }
Indeed, such is the nature of globs. Thanks, bpphillips, for starting this conversation.
Update: Here's a more concrete example, following the package definitions above:
use strict; use warnings; use Data::Dumper; warn "Perl version is '$]'\n"; { package Foo; our $x = undef; our @x = qw( alpha beta gamma ); } { package Bar; our @x = qw( alpha beta gamma ); } symdump('Foo','x'); symdump('Bar','x'); sub symdump { my ($pkg, $symbol) = @_; local(*SYM) = do { no strict 'refs'; ${*{"$pkg\::"}}{$symbol}; }; foreach my $slot (qw( SCALAR ARRAY HASH )) { warn Data::Dumper->Dump( [*SYM{$slot}], [ "\${ \*{\$$pkg\::{$s +ymbol}}{$slot} }" ] ); } } __END__ Perl version is '5.008005' ${ *{$Foo::{x}}{SCALAR} } = \undef; ${ *{$Foo::{x}}{ARRAY} } = [ 'alpha', 'beta', 'gamma' ]; ${ *{$Foo::{x}}{HASH} } = undef; ${ *{$Bar::{x}}{SCALAR} } = \undef; ${ *{$Bar::{x}}{ARRAY} } = [ 'alpha', 'beta', 'gamma' ]; ${ *{$Bar::{x}}{HASH} } = undef;
In Section
Seekers of Perl Wisdom