This question reminded me my old note I kept for case. It doesn't cover the actual topic but can be (or cannot be) considered as some hint.
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw(max);
# Lower weight means higher precedence
my %weight_map = (
alligator => 100,
bear => 90,
cat => 80,
jellyfish => 10,
zebra => 1,
);
my $weight_lowest = max(values %weight_map) + 1;
my @z0 = qw/ bear wolf jellyfish zebra dog fox cat /;
my @z1 = sort { $a cmp $b } @z0;
my @z2 = sort {
( $weight_map{$a} // $weight_lowest )
<=>
( $weight_map{$b} // $weight_lowest )
or
$a cmp $b;
} @z0;
print <<RESULT;
unsorted : [@z0]
sorted : [@z1]
weighted : [@z2]
RESULT
And the execution results to:
unsorted : [bear wolf jellyfish zebra dog fox cat]
sorted : [bear cat dog fox jellyfish wolf zebra]
weighted : [zebra jellyfish cat bear dog fox wolf]