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

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.

Replies are listed 'Best First'.
Re^3: symbol/glob hash explanation
by BrowserUk (Patriarch) on May 03, 2011 at 04:43 UTC
    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.

        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.