in reply to Assigning a reference to to a glob

I think you mean:

*$glob = { a => 1 };

Assignment of a reference to a glob performs a bit of magic; the reference gets stuck in the appropriate glob slot.

Replies are listed 'Best First'.
Re^2: Assigning a reference to to a glob
by Anonymous Monk on Oct 26, 2007 at 07:25 UTC

    That doesn't seem to work.

    #!/usr/bin/perl use strict; use warnings; use Data::Dump; use Symbol; my $glob = Symbol::gensym; warn "$glob\n"; dump $glob; *$glob = { a => 1 }; warn "$glob\n"; dump $glob; %{ *$glob } = ( 'a' => 1 ); @{ *$glob } = ( 1 .. 5 ); warn "$glob\n"; dump $glob;

    Gives

    GLOB(0x225130) do { require Symbol; Symbol::gensym(); } GLOB(0x225130) do { require Symbol; Symbol::gensym(); } GLOB(0x225130) do { require Symbol; my $a = Symbol::gensym(); *{$a} = [1, 2, 3, 4, 5]; *{$a} = { a => 1 }; $a; }

    If I autovivify a hash (and an array) into the glob, dump shows them there, but although the reference assignment doesn't produce errors, dumping the glob after doesn't show anything in the hash slot?

      If I autovivify a hash ...

      That turns out to be the problem. When you obtain a new glob, it doesn't have anything in the slots and attempting to assign a reference directly into one of the empty slots silently fails to do anything.

      But, if the glob already has something in a particular slot, you can overwrite it by a direct reference assignment:

      #!/usr/bin/perl use strict; use warnings; use Data::Dump; use Symbol; my $glob = Symbol::gensym; warn "$glob\n"; dump $glob; *{ $glob } = { a => 1 }; warn "$glob\n"; dump $glob; %{ *$glob } = ( 'a' => 1 ); @{ *$glob } = ( 1 .. 5 ); warn "$glob\n"; dump $glob; *{ $glob } = { b => 2 }; warn "$glob\n"; dump $glob; __END__ C:\test>junk5 GLOB(0x225130) do { require Symbol; Symbol::gensym(); } GLOB(0x225130) do { require Symbol; Symbol::gensym(); } GLOB(0x225130) do { require Symbol; my $a = Symbol::gensym(); *{$a} = [1, 2, 3, 4, 5]; *{$a} = { a => 1 }; ## Once the hash slot is in use $a; } GLOB(0x225130) do { require Symbol; my $a = Symbol::gensym(); *{$a} = [1, 2, 3, 4, 5]; *{$a} = { b => 2 }; ## you can overwrite it by direct assignment. $a; }

      There is a bug report in there somewhere.


      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.