On Feb 15, 2008 4:36 PM,  <[EMAIL PROTECTED]> wrote:
> I'm trying to figure out how to do an Excel type sort in Perl but
> can't seem to find anything on specifically what I want to do. So here
> goes.
>
> Imagine 3 columns of numbers: A, B, C.
>
> I want to sort in descending order starting with Column A then Column
> B, and then Column C.
>
> Thing is I don't want the order of A to change when sorting B and i
> don't want the order of A or B to change when sorting C.
>
> I have no idea if the way to do this is with arrays or hashes.
snip

When sorting an array of arrays, $a and $b will contain array
references.  Sorting an array of hashes works the same way (but $a and
$b will have hash references).  Whether you should use an array of
arrays or an array of hashes depends on the things other than the
sort.  In general, I try to use hashes to represent records as it
makes the code more self-documenting; however, some data lends itself
to arrays of arrays.

#!/usr/bin/perl

use strict;
use warnings;

my @aoa = (
        ["foo", 1, 3.4],
        ["foo", 2, 2],
        ["bar", 3, 10],
        ["bar", 3, 2],
        ["baz", 4, 0],
);

@aoa = sort {
        $a->[0] cmp $b->[0] or
        $a->[1] <=> $b->[1] or
        $a->[2] <=> $b->[2]
} @aoa;

print "aoa:\n";
for my $row (@aoa) {
        print "[EMAIL PROTECTED]";
}

my @aoh = (
        {name => "foo", pos => 1, value => 3.4},
        {name => "foo", pos => 2, value => 2},
        {name => "bar", pos => 3, value => 10},
        {name => "bar", pos => 3, value => 2},
        {name => "baz", pos => 4, value => 0},
);

@aoh = sort {
        $a->{name}  cmp $b->{name}  or
        $a->{pos}   <=> $b->{pos}   or
        $a->{value} <=> $b->{value}
} @aoh;

print "aoh:\n";
for my $row (@aoh) {
        print "[EMAIL PROTECTED]<name pos value>}\n";
}

-- 
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to