in reply to Re: Assigning a reference to to a glob
in thread Assigning a reference to to a glob

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?

Replies are listed 'Best First'.
Re^3: Assigning a reference to to a glob
by BrowserUk (Patriarch) on Oct 26, 2007 at 19:09 UTC
    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.