in reply to How can I add an entry in a has of arrays based on numeric comparison?

First of all, you have a mistake in your code. The first line in your loop should be:

my @split_hit_total = split(/\s+/, $_);

since $_ is your loop variable here, not $hit_total. (use strict is good for catching things like that, BTW!)

That said, to answer your question: repurpose your HoA so that it stores (for each $protein_ac) the lowest encountered iEvalue along with its corresponding range, rather than all ranges. E.g. instead of pushing the range, do this:

if(!defined($HoA_total_hits{$protein_ac}) || $HoA_total_hits{$protei +n_ac}->{'iEvalue'} > $iEvalue) { $HoA_total_hits{$protein_ac}->{'iEvalue'} = $iEvalue; $HoA_total_hits{$protein_ac}->{'range_b'} = $range_b; }

Untested in the absence of example data... and I've not had my morning brew yet, so apologies if this is obvious rubbish.

(Side note -- I turned your HoA into a HoH here, but didn't change the name. I'd advise against putting the type of a variable in its name anyway.)

EDIT: using the sample data from Re^2: How can I add an entry in a has of arrays based on numeric comparison?, here's what Data::Dumper has to say about the contents of $HoA_total_hits after running this:

$VAR1 = { 'I5EU07' => { 'range_b' => '232-824', 'iEvalue' => '3.4e-137' } };

Does that look right?

Replies are listed 'Best First'.
Re^2: How can I add an entry in a has of arrays based on numeric comparison?
by Anonymous Monk on Jun 26, 2014 at 09:44 UTC
    Aha, thanks!
    So, I must change the structure to HoH instead of HoA to achieve the desired result?
    (All these advanced structures seem so complicated to me!!!!)

      You don't have to; you can continue using a HoA as well, replacing (say) ->{'iEvalue'} with ->[0] and ->{'range_b'} with ->1. If you did this, the result for your sample data would be:

      $VAR1 = { 'I5EU07' => [ '3.4e-137', '232-824' ] };

      It's pretty much the same thing, but I personally prefer using hashes over arrays unless my "keys" are naturally numeric; you have to type a bit more, but your code'll be self-documenting. It's always obvious what ->{'iEvalue'} means, even years later when you're reading someone else's code, but the same is not true for ->[0].

        Thank you for the tips and code! Greatly appreciated!