in reply to symbol/glob hash explanation

Where can I find the gory details of this construct used by glob/symbol-based modules

See Typeglobs and Filehandles in perldata.

Is there another way to access that hash?

If $sym contains 'fred', then ${*$sym}{hash_key} = 'something'; is equivalent to $fred{hash_key} = 'something';.

Or strictly:

our %fred; $fred{hash_key} = 'something';
I can't find the equivalent of the STDIN example. Where is it stored? Is it a hash that's magically not accessible by name?

There is a hash (and array and scalar et al.) associated with the STDIN glob:

c:\test>perl -E"${*STDIN}{fred} = 'bill'; say $STDIN{fred}" bill
they just aren't normally used for anything.


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^2: symbol/glob hash explanation
by rwstauner (Acolyte) on May 03, 2011 at 04:36 UTC

    right, I understand those examples, but what about when $sym is *Symbol::GEN0 ?

    Is that hash "hidden" because it's not a simple name?

    DB<2> x $s = Symbol::gensym 0 GLOB(0x96f82b8) -> *Symbol::GEN0 DB<3> x ${*$s}{goo} = 'ber' 0 'ber' * DB<4> x \%{*$s} 0 HASH(0x96f82e8) 'goo' => 'ber' DB<5> x *$s 0 *Symbol::GEN0 DB<6> x $s 0 GLOB(0x96f82b8) -> *Symbol::GEN0 DB<7> x $Symbol::GEN0{goo} 0 undef * DB<8> x \%Symbol::GEN0 0 HASH(0x97783c0) empty hash * DB<9> x \%{Symbol::GEN0} 0 HASH(0x97783c0) empty hash * DB<10> x \%{*Symbol::GEN0} 0 HASH(0x97783c0) empty hash * DB<11> x \%{"Symbol::GEN0"} 0 HASH(0x97783c0) empty hash

    I've tried various ways of using the reference address and haven't found anything either.

      I've tried various ways of using the reference address

      All except the right one :)

      You already did x ${*$s}{goo} = 'ber' and x *$s -> *Symbol::GEN0

      So try:x ${*Symbol::GEN0}{goo}


      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.

        I did try that and it does not work, at least not on my 5.10.1

        DB<2> $s = Symbol::gensym DB<3> x ${*$s}{goo} = 'ber' 0 'ber' * DB<4> x \%{*$s}{goo} syntax error at (eval 8)[/usr/share/perl/5.10/perl5db.pl:638] line 2, +near "}{goo" * DB<5> x \%{*$s} 0 HASH(0x86285e8) 'goo' => 'ber' * DB<6> x \%{*Symbol::GEN0} 0 HASH(0x87144e0) empty hash * DB<7> x ${*Symbol::GEN0}{goo} 0 undef DB<8> x $] 0 5.010001 DB<9> x $s 0 GLOB(0x86285b8) -> *Symbol::GEN0

        ...

        * DB<8> x \%{*Symbol::GEN0} 0 HASH(0x8aab260) empty hash * DB<9> x \%{*{Symbol::GEN0}} 0 HASH(0x8aab260) empty hash * DB<10> x \%{*{*Symbol::GEN0}} 0 HASH(0x8aab260) empty hash * DB<11> x \%{'' . *$s} 0 HASH(0x8aab260) empty hash * DB<12> x \%{*$s} 0 HASH(0x8a5b5e8) 'goo' => 'ber' * DB<13> use Scalar::Util qw(refaddr) DB<14> x \%{*refaddr($s)} syntax error at (eval 20)[/usr/share/perl/5.10/perl5db.pl:638] line 2, + near "*refaddr(" * DB<15> x \%{refaddr($s)} 0 HASH(0x8b6eea0) empty hash * DB<16> x \%{sprintf "%x", refaddr($s)} 0 HASH(0x8b73ef0) empty hash * DB<17> x \%{*{"$s"}} 0 HASH(0x8b73c10) empty hash

        It does not show up when I dump \%:: (or \%Symbol or \%Symbol:: or \%Symbol::GEN0 or \%Symbol::GEN0:: either (excluded for brevity) at least not that i can see.