@ranked = sort { $a->{FIRST} cmp $b->{FIRST} or $a->{LAST} cmp $b->{LAST} or $a->{AGE} <=> $b->{AGE} } @employees;
####
#!/usr/bin/perl
use strict;
use warnings;
use Sort::Key qw(multikeysorter);
my @employees = (
{ FIRST => 'Bill', LAST => 'Gates',
SALARY => 600000, AGE => 45 },
{ FIRST => 'George', LAST => 'Tester',
SALARY => 55000, AGE => 29 },
{ FIRST => 'Sally', LAST => 'Developer',
SALARY => 55000, AGE => 29 },
{ FIRST => 'Joe', LAST => 'Tester',
SALARY => 55000, AGE => 29 },
{ FIRST => 'Steve', LAST => 'Ballmer',
SALARY => 600000, AGE => 41 }
);
my %types = (
FIRST => 'str',
LAST => 'str',
SALARY => 'int',
AGE => 'int',
);
my @sort = @ARGV; # not comma-separated, just for ease
@sort = map uc, @sort; # so I don't have to hold the shift key down.
my $sorter = multikeysorter( sub { my $A = $_; map { $A->{$_} } @sort }, @types{@sort} );
my @ranked = $sorter->(@employees);
foreach my $emp (@ranked) {
print "$emp->{SALARY}\t$emp->{AGE}\t$emp->{FIRST}\t$emp->{LAST}\n";
}
##
##
$ perl x.pl first age
600000 45 Bill Gates
55000 29 George Tester
55000 29 Joe Tester
55000 29 Sally Developer
600000 41 Steve Ballmer
$ perl x.pl age first
55000 29 George Tester
55000 29 Joe Tester
55000 29 Sally Developer
600000 41 Steve Ballmer
600000 45 Bill Gates
$ perl x.pl age last first
55000 29 Sally Developer
55000 29 George Tester
55000 29 Joe Tester
600000 41 Steve Ballmer
600000 45 Bill Gates
##
##
@types{map -$_, keys %types} = map -$_, values %types;
##
##
my $sorter = multikeysorter( sub { my $A = $_; map { $A->{s/^-//r} } @sort }, @types{@sort} );
##
##
$ perl5.14.2 x.pl -age last first
600000 45 Bill Gates
600000 41 Steve Ballmer
55000 29 Sally Developer
55000 29 George Tester
55000 29 Joe Tester
##
##
my $sorter = multikeysorter( sub { my $A = $_; map { (my $k = $_) =~ s/^-//; $A->{$k} } @sort }, @types{@sort} );