in reply to How best to validate the keys of hashref arguments?

if you know what keys are allowed you can check for ones that are not allowed

my %allowed = map ( $_ => 1 } qw/ name user host command/; for my $cmd (@commands) { my $badkeys=''; for my $key (keys %$cmd) { unless ($allowed {$key) {$badkeys.=' '.$k} } if ($badkeys) { print 'skipping due to badkeys found:'.$badkeys."\n"; next; } if ($state->{status} eq 'success') { ...

Replies are listed 'Best First'.
Re^2: How best to validate the keys of hashref arguments?
by johngg (Canon) on Mar 16, 2017 at 00:08 UTC

    Firstly, it looks like you have a typo in the "unless" line, $k should perhaps be $key.

    Secondly, using a scalar and concatenating spaces and bad keys onto a string seems a little awkward. Using an array instead and taking advantage of how it is interpolated inside double quotes seems more natural. I'm not sure why you use a mixture of single and double quotes along with concatenation in your print statement, just interpolate inside double quotes.

    use strict; use warnings; use feature qw{ say }; my %allowed = map { $_ => 1 } qw{ name user host command }; my @commands = ( { name => q{Fred Bloggs}, user => q{fbloggs}, host => q{red}, command => q{ls},, }, { name => q{Charlie Farley}, user => q{cfarley}, host => q{green}, zone => q{A}, building => q{Chaucer}, command => q{ps}, }, ); for my $command ( @commands ) { my @badKeys = grep { not exists $allowed{ $_ } } keys %$command; say @badKeys ? qq{Command invalid: bad keys: @badKeys} : q{Command OK}; }

    The output.

    Command OK Command invalid: bad keys: zone building

    I hope this is of interest.

    Cheers,

    JohnGG

      Thank you huck and johngg! I had tried looping through the keys to verify they were what I was expecting, but map and grep are dramatic improvements.

      Thanks,
      cbeckley