in reply to Getting indices of the same value that occurs multiple times in an array...

I think that it is easier to use the indexes() function in List::MoreUtils.

the snippet "indexes{/^1$/}@colData" yields the index numbers of elements in @colData that contains just a "1". This is an XS module like List::Util's and runs very fast. Getting the textual name is a simple array look-up. These terms are pushed into a HashOfArray. So, 2 lines of code that do a lot of work!

#!/usr/bin/perl -w use strict; use List::MoreUtils qw(indexes); use Data::Dumper; my %family_data; my @dataNames = qw( lacM taba mori glyB gly4); <DATA>; #skip the header line while (<DATA>) { my ($family, @colData) = split; push @{$family_data{$family}}, map{$dataNames[$_]}indexes{/^1$/}@colData; } print Dumper(\%family_data); =prints $VAR1 = { 'OG_2' => [ 'taba', 'glyB' ], 'OG_1' => [ 'lacM', 'mori' ] }; =cut __DATA__ Family lacM taba mori glyB gly4 OG_1 1 0 1 0 0 OG_2 0 1 0 1 0
Of course map{$dataNames[$_]}indexes{/^1$/}@colData;
could be map{$dataNames[$_]}indexes{$_}@colData;
but I thought the regex was less confusing albeit a bit slower.
either way is plausible, take your pick.