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
    Better yet, just use the Sort::Naturally module from CPAN

    Sort::Naturally does not handle numbers with decimals correctly. For instance, nsort '1.10', '1.31', '1.4' returns 1.4 1.10 1.31.

    But you can use Sort::Key::Natural instead which provides a set of functions for sorting strings embedding numbers with decimals:

    use Sort::Key::Natural qw(natwfsort); my @sorted = natwfsort @array;

    Update: Though, taking into account that the data in the OP says Patch_, maybe those numbers are actually version numbers and then the part after the decimal dot may be better sorted as an independent integer, which is what a regular natural sort does...

      Your comment is relevant and right, but I would tend to agree with your update and I assumed that these numbers are version numbers rather than decimals, so that 1.4 1.10 1.31 would probably be the correct order for such data.

      But we will be able to figure out for sure only if the OP comes back and tells us.