in reply to Sort Array of Hashes based on Hash value

Sorting on one key is simple enough:
@sorted = sort {$$a{"key"} <=> $$b{"key"} } @unsorted;
To sort on more than one key, i'd probably do something like this:
@sorted = sort {$$a{"least_signifigant_key"} <=> $$b{"least_signifigan +t_key"}} @unsorted; [...] @moresorted = sort{$$a{"most_signifigant_key"} <=> $$b{"most_signifiga +nt_key"}} @sorted;
A function would be prettier...
sub multi_key_sort { # pass me two references to arrays my $array = shift; # the first to the array that needs sorting.. my $keys = shift; # the second to an array of keys to sort by for my $key (@$keys) { @$array = sort {$$a{$key} cmp $$b{$key}} @$array; } return @$array; } my @sorted_array = &multi_key_sort(\@unsorted_array,\@array_of_keys); # @array_of_keys in order from least to most signifigant
--sean

Replies are listed 'Best First'.
RE: Re: Sort Array of Hashes based on Hash value
by sean (Beadle) on Jun 07, 2000 at 05:05 UTC
    Actually...
    sub this { my @array = @{(shift)} ; my $keys = shift ; for my $key (@$keys) { @array = sort {$$a{$key} cmp $$b{$key}} @array; } return @array; }
    would be a little cleaner. The original code would return a sorted array AND leave you with a sorted @unsorted. This way, by dereferencing the array, it will just return a sorted array, and leave @unsorted alone.
      I like the example from perlfaq4:
      Here we'll do a reverse numeric sort by value, and if two keys are identical, sort by length of key, and if that fails, by straight ASCII comparison of the keys (well, possibly modified by your locale -- see perllocale). @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %hash;
      as our peers above have pointed out ($$a{$key}) does the work in your case, but the idea of or'ing with a final cmp will probably get better results when you can't tell what's in those arrays.

      #!/home/bbq/bin/perl
      # Trust no1!
      Awesome!
RE: Re: Sort Array of Hashes based on Hash value
by raflach (Pilgrim) on Jun 07, 2000 at 03:54 UTC
    Exactly what I was looking for!!! Wow!