Perl multi-key stable sort with nulls
Perl
use strict;
use warnings;
sub sort_records {
my (@rows) = @_;
my $rank = 0;
$_->{_ord} = $rank++ for @rows;
return sort {
my $cmp = 0;
for my $key (qw(age name)) {
my ($x, $y) = ($a->{$key}, $b->{$key});
next if !defined $x && !defined $y;
$cmp = defined $x && defined $y ? $x cmp $y : (defined $x ? 1 : -1);
last if $cmp;
}
$cmp || $a->{_ord} <=> $b->{_ord};
} @rows;
}
my @sorted = sort_records({ name => 'b', age => 30 }, { name => 'a' }, { name => 'c', age => 30 });
print join(',', map { $_->{name} } @sorted), "\n";