use strict; my @list_defs = ( {2 => 'yes', 3 => ''}, {2 => 'yes', 7 => 'yes'}, {2 => 'yes', 3 => '', 6 => 'yes'}, ); my @lists; while () { my @vals = split /\|/; my $name = $vals[0]; my $i = 0; LIST: foreach my $l (@list_defs) { foreach (keys %$l) { next LIST unless $vals[$_] eq $l->{$_}; } push $lists[$i], $name; # or \@vals; $i++; } }