I have the following code intended to sort a hash of hashes by value:
#!/usr/bin/perl -w
use strict;
my %hoh_test;
$hoh_test{foo1}{bar} = -0.12697;
$hoh_test{foo1}{baz} = -0.000398154;
$hoh_test{foo2}{bar} = -4.0183e-05;
$hoh_test{foo2}{baz} = 0;
$hoh_test{foo3}{bar} = 9.966003977e-06;
$hoh_test{foo3}{baz} = 0.0001939;
# sort descending by value
foreach my $foo (keys(%hoh_test))
{
foreach my $ba (sort {$hoh_test{$foo}{$b} <=> $hoh_test{$foo}{$a}}
+ keys(%{$hoh_test{$foo}}))
{
printf("foo: $foo, ba: $ba, value: %s\n", $hoh_test{$foo}{$ba}
+);
}
}
Here is the expected output:
foo: foo3, ba: baz, value: 0.0001939
foo: foo3, ba: bar, value: 9.966003977e-06
foo: foo2, ba: baz, value: 0
foo: foo2, ba: bar, value: -4.0183e-05
foo: foo1, ba: baz, value: -0.000398154
foo: foo1, ba: bar, value: -0.12697
The actual output varies most times the program is run, so clearly my code doesn't work as intended. My two questions are:
1. How can I fix this to sort by values?
2. What exactly is it even doing now? Given that the output changes with most runs it doesn't appear to be sorting by anything.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.