in reply to Sorting or Aligning Parallel Hashes

Your analysis of the problem is quite accurate. If you do those steps, one at a time, you get what you want. Keep in mind that hashes can't be sorted, just their keys and/or values.

I would like to sort Hash “A” (key) in descending order
my @sorted_scores = sort { $b <=> $a } keys %HashA;
and then align the (value) Hash “A” with Hash “B” (key).
my @sorted_words = map { $HashA{$_} } @sorted_scores;
Then use that sort, to align Hash “C” so that the key value pairs of "C" can be printed out in the same order as the sorted “A” Hash.
my @sorted_line_nums = map { $HashB{$_} } @sorted_words;

And the print:

print($HashC{$_}, "\n"); foreach @sorted_line_nums;

All together now:

print("$_\n"); foreach map { $HashC{$HashB{$HashA{$_}}} } sort { $b <=> $a } keys %HashA;

I'm curious as to how you handle two lines having the same score, if the score is the key.

Replies are listed 'Best First'.
Re^2: Sorting or Aligning Parallel Hashes
by Gavin (Archbishop) on Mar 29, 2006 at 11:12 UTC
    Thanks very much for the help.
    Could you explain further how to use the sorted hash "A" to align the second hash "B"

      There's no such thing as a sorted hash(*), and I don't know what kind of terminology "align" is. You're confusing yourself by trying to be technical. Your data does NOT consist of unsorted hashes, sorted hashes and alignments; your data consists of scores, keywords, line numbers, text and the relationships between them.

      Your question is then "Could you explain further how to get the keywords for a list of (sorted) scores?" I used:

      my @sorted_words = map { $HashA{$_} } @sorted_scores;
      I could also have used:
      my @sorted_words; foreach (@sorted_scores) { push(@sorted_words, $HashA{$_}; }

      %HashA defines the relationship between scores and keywords. To get a list of keywords for a list of scores, simply loop over all the scores and use %HashA to find the corresponding keywords.

      * - Well, it's possible using tie, but that's neither needed nor relevant here.

        I don't get why you didn't use a hash slice.
        my @sorted_words = @HashA{@sorted_scores};

        push(@sorted_words = $HashA{$_};
        That is sooo wrong, I can't believe you wrote that.
        push @sorted_words, $HashA{$_};