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

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!