Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^2: Autovivification sucking the life out of me

by shenme (Priest)
on Oct 14, 2005 at 07:51 UTC ( [id://500153]=note: print w/replies, xml ) Need Help??


in reply to Re: Autovivification sucking the life out of me
in thread Autovivification sucking the life out of me

But I am not explicitly telling Perl to autovivify, rather I am (intending to) just reference the values, in this case using a slice.

Refer to my simpler example above. Using see_args( @foo{qw(BAR BAZ)} ); causes result:

at start: BAR '<absent>' at end: BAR '<undef>'
But changing that to see_args( $foo{BAR}, $foo{BAZ} ); results in:
at start: BAR '<absent>' at end: BAR '<absent>'
This is most perplexing to me.

Replies are listed 'Best First'.
Re^3: Autovivification sucking the life out of me
by Skeeve (Parson) on Oct 14, 2005 at 08:17 UTC

    Tell you what: It's perplexing to me the other way around!

    Until 2 days ago I thought something like
    if ($foo{'BAR'}) ...
    would already vivify that hash entry.

    But then I learned in the Chatter Box that it doesn't in perl 5.8 (or maybe a bit earlier).

    And now I did a test. Compare the output

    use Data::Dumper; %foo=(BAZ=>1); print Dumper \%foo if $foo{BAR} || 1; print Dumper \%foo if @foo{BAR,BAZ} || 1;
    Output:

    $VAR1 = {
              'BAZ' => 1
            };
    $VAR1 = {
              'BAZ' => 1
            };

    use Data::Dumper; %foo=(BAZ=>1); print Dumper \%foo if call($foo{BAR}); print Dumper \%foo if call(@foo{BAR,BAZ}); sub call { return 1 }
    Output:

    $VAR1 = {
              'BAZ' => 1
            };
    $VAR1 = {
              'BAR' => undef,
              'BAZ' => 1
            };

    So it's really the fact that the slice is used in a subroutine call. When you replace call with print, autovivification does not happen

    So now I ask myself: Is there a bug and you are certified bugfinder!? ;-)


    s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
    +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://500153]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (6)
As of 2024-04-24 10:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found