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";