Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Re^2: Devel::Symdump and symbol table woes

by trammell (Priest)
on Sep 17, 2007 at 17:43 UTC ( #639450=note: print w/replies, xml ) Need Help??

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:
{ package Foo; our $x = undef; our @x = qw( alpha beta gamma ); } { package Bar; our @x = qw( alpha beta gamma ); }
... 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.

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;

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://639450]
[Corion]: Hmm - is anybody aware of a "protocol-only" HTTP module? I'd like to teach Prima non-blocking HTTP ideally without using threads, but that means reimplementing/ rewriting something like HTTP::Tiny (except asynchronous) or AnyEvent::HTTP
[Corion]: Ideally, the HTTP state machine but with a way to feed it HTTP data whenever I get it instead of it actively doing stuff.
[Corion]: Now that I talk about this, maybe Net::Inspect::L7:: HTTP would be the right kind of thing for the responses at least.

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (12)
As of 2016-12-07 15:08 GMT
Find Nodes?
    Voting Booth?
    On a regular basis, I'm most likely to spy upon:

    Results (128 votes). Check out past polls.