use Inline::Files; /(Gene\d+)/ and undef $a[0]->{$1} for ; while($e++ < 3 and $f = 'FILE'.$e) { /(Gene\d+)/ and undef $a[$e]->{$1} for <$f>; } foreach $k (sort keys %{$a[0]}){ print "$k\t", join(' ', map {exists $a[$_]->{$k} ? 1 : 0} 1..$#a),"\n"; } __LIST__ Gene1 Gene2 Gene3 Gene4 Gene5 Gene6 __FILE1__ Gene1 Gene2 Gene3 __FILE2__ Gene2 Gene3 Gene4 __FILE3__ Gene3 Gene4 Gene5 Gene6