use strict; use Data::Dumper; my ($hash, @array); my @array = ; $hash ={ map { chomp; my $key = (split(/\t/) )[0]; $key => [ grep { chomp; $_ if( (split(/\t/) )[0] =~/$key/) } @array ] } @array }; print Dumper(\%$hash); __DATA__ 1 2 a 1 13 w 1 20 c 2 1 b 2 40 n 3 30 a