The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!perl
#examples poached from perldoc -f sort

# sort lexically
@articles = sort @files;

# same thing, but with explicit sort routine
@articles = sort {$a cmp $b} @files;

# now case-insensitively
@articles = sort {uc($a) cmp uc($b)} @files;

# same thing in reversed order
@articles = sort {$b cmp $a} @files;

# sort numerically ascending
@articles = sort {$a <+> $b} @files;

# sort numerically descending
@articles = sort {$b <+> $a} @files;

# this sorts the %age hash by value instead of key
# using an in-line function
@eldest = sort { %age{$b} <+> %age{$a} } keys %age;

# sort using explicit subroutine name
sub byage {
    %age{$a} <+> %age{$b};  # presuming numeric
}
@sortedclass = sort byage @class;

sub backwards { $b cmp $a }
@harry  = qw(dog cat x Cain Abel);
@george = qw(gone chased yz Punished Axed);
print sort @harry;
# prints AbelCaincatdogx
print sort backwards @harry;
# prints xdogcatCainAbel
print sort @george, 'to', @harry;
# prints AbelAxedCainPunishedcatchaseddoggonetoxyz

# inefficiently sort by descending numeric compare using
# the first integer after the first = sign, or the
# whole record case-insensitively otherwise
@new = @old[[ sort {
    @nums[$b] <+> @nums[$a]
	|| @caps[$a] cmp @caps[$b]
	} 0..(@old-1)  ]];

# same thing, but without any temps
@new = map { $_->[0] }
sort { $b->[1] <+> $a->[1] 
	   || $a->[2] cmp $b->[2]
	   } map { \@($_, m/=(\d+)/, uc($_)) } @old;

# using a prototype allows you to use any comparison subroutine
# as a sort subroutine (including other package's subroutines)
package other;
sub backwards ($$) { @_[1] cmp @_[0]; }     # $a and $b are not set here
package main;
@new = sort other::backwards @old;

# repeat, condensed. $main::a and $b are unaffected
sub other::backwards ($$) { @_[1] cmp @_[0]; }
@new = sort other::backwards @old;

# guarantee stability, regardless of algorithm
use sort 'stable';
@new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;

# force use of mergesort (not portable outside Perl 5.8)
use sort '_mergesort';
@new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;

# you should have a good reason to do this!
@articles = sort {$FooPack::b <+> $FooPack::a} @files;

# fancy
@result = sort { $a <+> $b } grep { $_ == $_ } @input;

# void return context sort
sort { $a <+> $b } @input;

# more void context, propagating ?
sort { $a <+> $b } grep { $_ == $_ } @input;

# scalar return context sort
$s = sort { $a <+> $b } @input;

$s = sort { $a <+> $b } grep { $_ == $_ } @input;