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]