Steven Massey wrote: > > I have an array, each line contains fields seperated by ":" > I want to sort the array numerically ascending by the last field. > > my thoughts are to split fields into seperate arrays, go through the last > array in a comparing process, moving each row index in the original array > to reflect the sort. ( I found this hard to explain) > > Do any of you some tips as to how to approach this ?? >
not suprisingly, there are many approach to this. i actually take some time to benchmark some of the most populars and see what will be better: #!/usr/bin/perl -w use strict; use Benchmark; my @array = ('abcd:xxx:1234','yyy:xxx:2','a:b:12'); sub sr_s{ for(sort {(my $a_value = $a) =~ s/.+:.+://; (my $b_value = $b) =~ s/.+:.+://; $a_value <=> $b_value} @array){;} } sub split_s{ for(sort {my @a_val = split(/:/,$a); my @b_val = split(/:/,$b); $a_val[2] <=> $b_val[2]} @array){;} } sub split_ref_s{ for(sort {(split(/:/,$a))[2] <=> (split(/:/,$b))[2]} @array){;} } sub reg_s{ for(sort { my ($i) = $a =~ /(\d+)$/; my ($j) = $b =~ /(\d+)$/; $i <=> $j} @array){;} } sub reg_ref_s{ for(sort {($a =~ /(\d+)$/)[0] <=> ($b =~ /(\d+)$/)[0]} @array){;} } timethese(99999,{split_s => \&split_s, split_ref_s => \&split_ref_s, reg_s => \®_s, reg_ref_s => \®_ref_s, sr_s => \&sr_s}); __END__ prints: Benchmark: timing 99999 iterations of reg_ref_s, reg_s, split_ref_s, split_s, sr_s... reg_ref_s: 35 wallclock secs (15.13 usr + 0.02 sys = 15.15 CPU) @ 6600.59/s (n=99999) reg_s: 40 wallclock secs (18.17 usr + 0.02 sys = 18.19 CPU) @ 5497.47/s (n=99999) split_ref_s: 30 wallclock secs (13.87 usr + 0.01 sys = 13.88 CPU) @ 7204.54/s (n=99999) split_s: 54 wallclock secs (23.12 usr + 0.03 sys = 23.15 CPU) @ 4319.61/s (n=99999) sr_s: 31 wallclock secs (13.37 usr + 0.01 sys = 13.38 CPU) @ 7473.77/s (n=99999) looks like sr_s is the winner. david -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]