in reply to Re^4: symbol/glob hash explanation
in thread symbol/glob hash explanation

Looking into Symbol, that is apparently deliberate:

my $genpkg = "Symbol::"; my $genseq = 0; sub gensym () { my $name = "GEN" . $genseq++; ## Instantiate the glob and take a reference to it. my $ref = \*{$genpkg . $name}; ## Delete the name, leaving a reference to an anonymous glob delete $$genpkg{$name}; ## return the ref $ref; }

Thus, it effectively mirrors the behaviour [] and {} in that you have a reference to a structure that doesn't (no longer) appears in the pad (symbol table).

The few times I've wanted an anonymous glob I've used:

$r = do{ \local *FRED };; print $r;; GLOB(0x4055f70)

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^6: symbol/glob hash explanation
by rwstauner (Acolyte) on May 03, 2011 at 16:55 UTC

    Aha! Thank you!

    I definitely should have looked at Symbol.pm before using it in my examples... Now I see why they suggest that you use it (and why the IO modules use it).

    So taking into account that Symbol::gensym uses deliberate voodoo, going back to the STDIN example makes it more clear... It is in fact part of the *foo{THING} syntax (*foo{HASH} in these examples):

    DB<13> ${*STDIN}{goo} = 'ber' DB<14> x \%{*STDIN} 0 HASH(0x9a7d878) 'goo' => 'ber' * DB<15> x \%STDIN 0 HASH(0x9a7d878) 'goo' => 'ber' * DB<17> x *STDIN 0 *main::STDIN * DB<18> x *STDIN{HASH} 0 HASH(0x9a7d878) 'goo' => 'ber' * DB<19> x *STDIN{IO} 0 IO::Handle=IO(0x97a5980)

    And a full example demonstrating gensym's symbol table manipulation:

    * DB<6> $s = \*Symbol::GEN1 DB<7> x $s 0 GLOB(0x9cca740) -> *Symbol::GEN1 DB<8> x ${*$s}{goo} = 'ber' 0 'ber' * DB<9> x \%{*$s} 0 HASH(0x9d4ace8) 'goo' => 'ber' * DB<10> x \%Symbol::GEN1 0 HASH(0x9d4ace8) 'goo' => 'ber' * DB<13> x *Symbol::GEN1{HASH} 0 HASH(0x9d4ace8) 'goo' => 'ber' * DB<15> x *Symbol::GEN1{HASH}{pea} = 'nut' 0 'nut' DB<16> x \%{*$s} 0 HASH(0x9d4ace8) 'goo' => 'ber' 'pea' => 'nut' * DB<17> delete $Symbol::{GEN1} DB<18> x \%{*$s} 0 HASH(0x9d4ace8) 'goo' => 'ber' 'pea' => 'nut' * DB<19> x *Symbol::GEN1{HASH} 0 undef DB<20> x \%{*$s} 0 HASH(0x9d4ace8) 'goo' => 'ber' 'pea' => 'nut'

    So while there's definitely some black magic happening there (and with the symbol tables in general) I have a better idea of what is happening behind the curtain in this particular instance... I now see where that hash is going (or where it has been (or something like that)). Thank you very much!