in reply to Re^3: sort hash of arrays of arrays
in thread sort hash of arrays of arrays

I'd like to sort the outer arrays of each hash item (1-4) separately, based on the second item of the inner arrays to finally have something like:

{ 1 => [ [26, 27, 28], [16, 17, 18], [6, 7, 8], [1, 2, 3] ], 2 => [ [27, 28, 29], [17, 18, 19], [7, 8, 9], [2, 3, 4], ], 3 => [ [28, 29, 30], [18, 19, 20], [8, 9, 10], [3, 4, 5] ], 4 => [ [29, 30, 31], [19, 20, 21], [9, 10, 11], [4, 5, 6] ], }

So for the first set, values 2, 7, 17 and 27 were compared to get the right order.
I hope this clarifies my problem.

Thanks

Replies are listed 'Best First'.
Re^5: sort hash of arrays of arrays
by BrowserUk (Patriarch) on Oct 31, 2012 at 16:05 UTC

    Then you need to do one sort for each key in the hash like this:

    @{ $hash{$_} } = sort{ $b->[1] <=> $a->[1] } @{ $hash{$_} } for keys % +hash;; pp \%hash;; { 1 => [[26, 27, 28], [16, 17, 18], [6, 7, 8], [1, 2, 3]], 2 => [[27, 28, 29], [17, 18, 19], [7, 8, 9], [2, 3, 4]], 3 => [[28, 29, 30], [18, 19, 20], [8, 9, 10], [3, 4, 5]], 4 => [[29, 30, 31], [19, 20, 21], [9, 10, 11], [4, 5, 6]], }

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

    RIP Neil Armstrong

      It's awesome, thank you!
      How does it work? Specifically, why does it need the for keys %hash part? How could I sort on the innermost elements (e.g. [26, 27, 28] to get [28, 27, 26]) using the same method?
      Thanks very much.

        How does it work? Specifically, why does it need the "for keys %hash" part?

        Because, as I said, you need to do one sort for each key.

        (I don't know how better to explain it than that. )

        How could I sort on the innermost elements (e.g. [26, 27, 28] to get [28, 27, 26]) using the same method?

        Now you need to do one sort for each sub array, for each key, so you need nested loops:

        for my $key ( keys %hash ) { for my $aref ( @{ $hash{ $key } } ) { @{ $aref } = sort { $b <=> $a } @{ $aref }; } } ;; pp \%hash;; { 1 => [[28, 27, 26], [18, 17, 16], [8, 7, 6], [3, 2, 1]], 2 => [[29, 28, 27], [19, 18, 17], [9, 8, 7], [4, 3, 2]], 3 => [[30, 29, 28], [20, 19, 18], [10, 9, 8], [5, 4, 3]], 4 => [[31, 30, 29], [21, 20, 19], [11, 10, 9], [6, 5, 4]], }

        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

        RIP Neil Armstrong