Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re: Getting indices of the same value that occurs multiple times in an array...

by Marshall (Abbot)
on Aug 05, 2011 at 10:35 UTC ( #918730=note: print w/replies, xml ) Need Help??

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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://918730]
[LanX]: or maybe that's your problem ? :)

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (9)
As of 2017-10-18 20:28 GMT
Find Nodes?
    Voting Booth?
    My fridge is mostly full of:

    Results (250 votes). Check out past polls.