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.
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.
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!
Of course map{$dataNames[$_]}indexes{/^1$/}@colData;#!/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
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.
|
---|
In Section
Seekers of Perl Wisdom