$ra cmp $rb || # this is number. Shouldn't this be <=> ? #### #!/usr/bin/perl -wl use strict; use Benchmark; use vars qw/ @data /; use vars qw/ @results1 @results2 /; @data = qw/ 18DD13AR0B2.vec 5A344R2B15.ras 5A344R2B15.vec 5A35SR0.ras 113A28R1.vec 113A28AR0.vec 113A29R0.ras 5A32R0.ras 113A29R1.vec 18AD13XR0B3.ras 18AD13XR0B3.vec 113A22R1.ras 5A35R0.vec 5A34R0.ras 113A22R1.vec 18DD12YR0B2.vec 18DD13AR0B2.ras 113A29AR0.ras 113A29AR2.vec 113A28R0.vec 5A33R0.vec 5A34R0.vec 5A35R0.ras 113A28AR2.vec 113B28R2.ras 113A28R2.vec 13B29AR0B1.ras 113B29AR0B1.vec 5A32R0.vec 5A33R0.ras /; timethese(5000, { 'mkmcconn' => ' @results1 = (); for (sort{ my ($t0a,$t1a,$p0a,$pda,$ra,$alta,$la) = map(m!(\d+)(\D+)(\d+)(\D*)R(\d+)B?(\d*)\.(\w+)$!,$a); my ($t0b,$t1b,$p0b,$pdb,$rb,$altb,$lb) = map(m!(\d+)(\D+)(\d+)(\D*)R(\d+)B?(\d*)\.(\w+)$!,$b); $la cmp $lb || ($altb eq ""? 0 :$altb) <=> ($alta eq "" ? 0 : $alta) || $t0a <=> $t0b || $t1a cmp $t1b || $p0a <=> $p0b || $ra cmp $rb || $pda cmp $pdb; } @data ) { push @main::results1, $_; } ', 'Ovid' => ' @main::results2 = (); @main::results2 = map { $_->[0] } sort { $a->[1][0] cmp $b->[1][0] || $b->[1][1] <=> $a->[1][1] || $a->[1][2] <=> $b->[1][2] || $a->[1][3] cmp $b->[1][3] || $a->[1][4] <=> $b->[1][4] || $a->[1][5] <=> $b->[1][5] || $a->[1][6] cmp $b->[1][6] } map { [$_, main::get_data( $_ )] } @main::data; ', }); use Data::Dumper; open T, "> test.txt" or die $!; print T Dumper \@results1, \@results2; close T; sub get_data { local $_ = shift; my @data = ( m!(\d+)(\D+)(\d+)(\D*)R(\d+)B?(\d*)\.(\w+)$! ); # add default, if necessary $data[3] ||= ''; $data[4] ||= 0; $data[5] ||= 0; # reorder the data for sorting @data = @data[ 6, 5, 0, 1, 2, 4, 3 ]; return \@data; } #### C:\>perl test.pl Benchmark: timing 5000 iterations of mkmcconn, Ovid ... mkmcconn: 69 wallclock secs (68.61 usr + 0.00 sys = 68.61 CPU) @ 72.88/s (n=5000) Ovid: 32 wallclock secs (32.68 usr + 0.00 sys = 32.68 CPU) @ 153.00/s (n=5000)