Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Check for existence of elements in a Hashref

by quicoju (Initiate)
on May 03, 2013 at 23:23 UTC ( #1031972=perlquestion: print w/replies, xml ) Need Help??
quicoju has asked for the wisdom of the Perl Monks concerning the following question:


I'm trying to check that a number of elements exist in a Hashref. Instead of checking for one element at a time, I'd like to do the check them all in one pass.

The following code is what I've tried so far, but I'm getting some unexpected behavior. It looks that it only check s for the last element in the slice

sub add_ingredient { my $args = shift; if ( @{$args}{ qw/name unit quantity/ } ) { print "All elements exist\n" } else { print "Hey some information is missing \n"; } } add_ingredient({ name => "carrot", unit => "lb", }); #output: Hey some information is missing add_ingredient({ quantity => 1.0, }); #output: All elements exist

Is this the correct way to check for element existence?

Please enlighten me ...Thanks

Replies are listed 'Best First'.
Re: Check for existence of elements in a Hashref
by LanX (Bishop) on May 03, 2013 at 23:36 UTC
    > Is this the correct way to check for element existence?

    the correct way is to use exists on each element.

    But if you wanna check multiple keys in one run, why not using keys to get them?


    you could try this to apply hash-slices:

    DB<230> sub tst{ my $href=shift; my %needed; @needed{qw/name unit quantity/}=(); delete @needed{ keys %$href }; print "Elements missing; ", keys %needed if %needed; } DB<231> tst({name=>1,bla=>2,unit=>3,quantity=>4}) DB<232> tst({name=>1,bla=>2,unit=>3}) Elements missing; quantity DB<233> tst({bla=>2,unit=>3}) Elements missing; quantityname

    but this is certainly easier understood and maintained:

    DB<234> sub tst{ my $href=shift; my @missing = grep { ! exists $href->{$_} } qw/name unit +quantity/; print "Elements missing: @missing" if @missing; } DB<235> tst({name=>1,bla=>2,unit=>3,quantity=>4}) DB<236> tst({name=>1,bla=>2,unit=>3}) Elements missing: quantity

    Cheers Rolf

    ( addicted to the Perl Programming Language)

      Great answer, thanks!

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1031972]
Approved by Athanasius
[Corion]: Ouch - Eventbrite (at least for the US and Germany) gets implicit access to your events and access to film there too. No using Eventbrite it is then ;)
[choroba]: You mean the people from the company can come to the event and shoot a film there?

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2018-04-22 19:36 GMT
Find Nodes?
    Voting Booth?