Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re^2: Possible useless use of map

by almut (Canon)
on Mar 18, 2010 at 10:27 UTC ( [id://829372]=note: print w/replies, xml ) Need Help??


in reply to Re: Possible useless use of map
in thread Possible useless use of map

Actually, I'm a bit surprised that I do get the same warning with a slightly modified variant:

$ perl -Mstrict -Mwarnings -MData::Dumper -le 'my $hr; $hr->{stuff}{fo +o} for 1; print Dumper $hr' Useless use of hash element in void context at -e line 1. $VAR1 = { 'stuff' => {} };

As it autovivifies, it's not "useless", strictly speaking...  Also, what about (intended) side effects with tied hashes?

Replies are listed 'Best First'.
Re^3: Possible useless use of map
by ikegami (Patriarch) on Mar 18, 2010 at 20:40 UTC

    As it autovivifies, it's not "useless", strictly speaking..

    By that logic, the following shouldn't warn since calling f() isn't useless:
    $ perl -c -we'f()+123' Useless use of addition (+) in void context at -e line 1. -e syntax OK

    You're mistaken about what gives the warning. The op that does the autovivification is not the one issuing the warning. It's the access of the foo element that issues the warning, and it's indeed useless to access the foo element.

    $ perl -we'my $hr; $hr->{stuff}{foo}' Useless use of hash element in void context at -e line 1.

    is basically equivalent to

    $ perl -we'my $hr; $_ = \%{ $hr }; $_ = \%{ $_->{stuff} }; $_->{foo};' Useless use of hash element in void context at -e line 1.

    The last bit is clearly useless.

    If you prefer a diagram,

    ___________________ scalar context pad fetch. autovivifies / ________________ deref | / ____________ scalar context hash fetch. autovivifies | | / _______ deref | | | / ____ void context hash fetch. warns. | | | | / |--|-|------|-|----| $hr->{stuff}->{foo};

    Similar, without useless bits:

    $hr->{stuff} //= {};

    Also, what about (intended) side effects with tied hashes?

    Warnings aren't always accurate. That's why you can turn them off.

    Update: Additions for the sake of clarity.

Re^3: Possible useless use of map
by Anonymous Monk on Mar 18, 2010 at 10:31 UTC
    Well the first version also auotovivifies.... i'm not sure what you mean about tied hashes.

      No, $hr->{stuff} alone doesn't autovivify the element. It's the dereferencing operation

      $hr->{stuff}->{foo} ^^

      that autovivifies, not merely accessing the hash element.

      As for side effects with tied hashes, I mean that arbitrary code could be associated with the tied read operation.

        :D You're not paying attention
        $ perl -MDDS -w -le " my $hr; $hr->{stuff}; Dump($hr)" $HASH1 = {}; $ perl -MDDS -Mwarnings -le " my $hr; $hr->{stuff}; Dump($hr)" Useless use of hash element in void context at -e line 1. $HASH1 = {};
        $hr used to be undef, after $hr->{stuff} it is a hashref.

        Curiously, my little test reveals Data::Dump::Streamer breaks the -w switch .

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (5)
As of 2024-03-28 08:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found