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
In reply to Re^2: How best to validate the keys of hashref arguments?
by johngg
in thread How best to validate the keys of hashref arguments?
by cbeckley
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |