Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

If I have a lexical reference to a glob

my $glob = Symbol::gensym;

How can I assign an anonymous hash to it? This doesn't work

*$glob{HASH} = { a => 1 };

Gives "Can't modify glob elem in scalar assignment"

Replies are listed 'Best First'.
Re: Assigning a reference to to a glob
by chromatic (Archbishop) on Oct 26, 2007 at 06:57 UTC

    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.

      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.