http://qs1969.pair.com?node_id=134257


in reply to complex sort

Thank you all very much for your helpful suggestions. I combined them to form the following (which even (accidentally) managed to beat Ovid's by a hair):
mkmcconn: 4 wallclock secs ( 4.66 usr + 0.00 sys = 4.66 CPU) @ 1073.88/s (n=5000)
ovid: 7 wallclock secs ( 7.10 usr + 0.00 sys = 7.10 CPU) @ 704.13/s (n=5000)

@result1 = map{join '',@$_[0..4,6,8]} sort{ $a->[8] cmp $b->[8] || ($b->[7] eq '' ? 0 : $b->[7]) <=> ($a->[7] eq '' ? 0 : $a->[7] +) # didn't manage to eliminate this without warnings || $a->[0] <=> $b->[0] || $a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] || $a->[5] <=> $b->[5] || $a->[3] cmp $b->[3] } map {[m/(\d+)(\D+)(\d+)(\D*)(R(\d+))(B?(\d*))(\.\w+)\s*$/] } <DATA +>;

mkmcconn
corrected order

Replies are listed 'Best First'.
Re: Re: complex sort
by Anonymous Monk on Dec 25, 2001 at 06:52 UTC

    You simplify the second sort condition from using ?: to using ||:

    # this: ($b->[7] eq '' ? 0 : $b->[7]) <=> ($a->[7] eq '' ? 0 : $a->[7] # to this: ($b->[7]||0) <=> ($a->[7]||0)