my @keys = ( qw|a e i o u| ); my @records = (); push @records, '1|2|3|d|4'; push @records, '1|2|3|a|4'; push @records, '1|2|3|d|4'; push @records, '1|2|3|o|4'; my @final = (); my @result = (); my $re = ''; foreach my $key ( @keys ) { @result = grep{ m/^\d\|\d\|\d\|$key\|\d$/ } @records; push @final, [ @result ] if @result; } print map{ "@{ $final[$_] }\n" } 0..$#final;