#! perl -slw use strict; use Benchmark qw[ cmpthese ]; use Sort::Key::Maker sort_num_str => sub { /^(\d+)(.*)/ }, qw(num str); sub log10{ log( $_[ 0 ]) / log( 10 ) } our $N ||= 1000; our $CHECK ||= 0; our $ITERS = $CHECK ? 1 : -int( log10 $N ); our @data = map{ int( rand 1000 ) . ('A'..'Z')[ rand 26 ] } 1 .. $N; my %tests = ( sort => q[ my @sorted = sort{ $^W=0; $a<=>$b or $a cmp $b } @data; print "s:@sorted" if $CHECK; ], 'S::M' => q[ my @sorted = sort_num_str @data; print "S::M:@sorted" if $CHECK; ], GRT => q[ my @sorted = map { substr $_, 4 } sort map { $^W=0; pack 'NA*', 0+$_, $_ } @data; print "GRT:@sorted" if $CHECK; ], ); cmpthese $ITERS, \%tests;