in reply to sorting an array with decimal points
Hello levW,
Although each member of the sample data starts with Patch_, I would still play it safe and allow for the possibility of a different prefix:
use strict; use warnings; my @array = qw(Patch_1.0 Patch_2.0 Patch_3.1 Patch_5.0 Patch_4.2 Patch +_6.0 Patch_7.0 Patch_8.0 Patch_9.3 Patch_10.2 Apatch_11.0); @array = sort patch_sort @array; print "$_\n" for @array; sub patch_sort { my ($a_name, $a_version) = $a =~ / (\w+) _ ([\d.]+) $ /x or die 'Invalid lhs, stopped'; my ($b_name, $b_version) = $b =~ / (\w+) _ ([\d.]+) $ /x or die 'Invalid rhs, stopped'; return $a_name cmp $b_name || $a_version <=> $b_version; }
Output:
18:22 >perl 1860_SoPW.pl Apatch_11.0 Patch_1.0 Patch_2.0 Patch_3.1 Patch_4.2 Patch_5.0 Patch_6.0 Patch_7.0 Patch_8.0 Patch_9.3 Patch_10.2 18:22 >
See sort.
Update 1: Better yet, just use the Sort::Naturally module from CPAN:
use strict; use warnings; use Sort::Naturally; my @array = qw(Patch_1.0 Patch_2.0 Patch_3.1 Patch_5.0 Patch_4.2 Patch +_6.0 Patch_7.0 Patch_8.0 Patch_9.3 Patch_10.2 Apatch_11.0); @array = nsort @array; print "$_\n" for @array;
for the same result.
Update 2: I should have read the documentation for Sort::Naturally more carefully: :-(
I define "numeric substring" just as sequences matching m/\d+/ -- scientific notation, commas, decimals, etc., are not seen.
Thanks salva: good catch!
Hope that helps,
| Athanasius <°(((>< contra mundum | Iustus alius egestas vitae, eros Piratica, |
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: sorting an array with decimal points
by salva (Canon) on Jan 15, 2018 at 08:04 UTC | |
by Laurent_R (Canon) on Jan 15, 2018 at 20:12 UTC |