c:\@Work\Perl>perl -wMstrict -le "my %commands; ;; for my $ar_keys_val ( [ qw(GENERATE CREATE) => '10 14 00 07 4d', ], [ qw(DELETE) => '12 34 56 78 90', ], [ qw(DELIVER) => '16 75 32 14 77', ], [ qw(FOO BAR BOFF) => '99 88 77 66 55', ], ) { my @multi_keys = @{ $ar_keys_val }[ 0 .. $#$ar_keys_val - 1 ]; my $single_val = @{ $ar_keys_val }[-1]; for my $mk (@multi_keys) { die qq{duplicate key '$mk' -> '$single_val'} if exists $commands{$mk}; $commands{$mk} = $single_val; } }; ;; use Data::Dump qw(dd); ;; dd \%commands; ;; CMD: for my $cmd (qw(FOO BAR XBAR BARR DEL DELI)) { printf qq{command '$cmd': }; my @candidates = grep { 0 == index $_, $cmd } keys %commands; if (not @candidates) { print qq{not found}; next CMD; } if (@candidates > 1) { print qq{ambiguous: @candidates}; next CMD; } print qq{($candidates[0]) -> '$commands{$candidates[0]}'}; } " { BAR => "99 88 77 66 55", BOFF => "99 88 77 66 55", CREATE => "10 14 00 07 4d", DELETE => "12 34 56 78 90", DELIVER => "16 75 32 14 77", FOO => "99 88 77 66 55", GENERATE => "10 14 00 07 4d", } command 'FOO': (FOO) -> '99 88 77 66 55' command 'BAR': (BAR) -> '99 88 77 66 55' command 'XBAR': not found command 'BARR': not found command 'DEL': ambiguous: DELIVER DELETE command 'DELI': (DELIVER) -> '16 75 32 14 77'