use warnings; use strict; use Data::Dump qw(dd); use Test::More 'no_plan'; use Test::NoWarnings; my $ver = qr{ - (\d+) [.] (\d+) [.] (\d+) - (\d+) [.] }xms; my %latest; my @most_recent = map $latest{ $_->[0] }[1] eq $_->[2] ? $_->[2] : (), map { $latest{$_->[0]} = [ @$_[1,2] ] if ! $latest{$_->[0]} or $latest{$_->[0]}[0] lt $_->[1]; $_; } map [ (m{ \A (.*?) $ver }xms)[0], pack('N4', m{$ver}xms), $_ ], map validate($_), map { chomp; $_; } ; dd \@most_recent; is_deeply \@most_recent, [ qw( samba-common-libs-4.2.12-7.el7_2.x86_64 abc-4.2.11-10.el7_2.x86_64 xyz-libs-4.2.13-7.el7_2.x86_64 )], "extracted by most recent version"; done_testing; sub validate { return $_[0]; } # data from Marshall pm#1174121 # also added: # samba-common-libs-4.2.9-8.el7_2.x86_64 # abc-4.2.11-10.el7_2.x86_64 __DATA__ samba-common-libs-4.2.12-7.el7_2.x86_64 samba-common-libs-4.2.10-3.el7_2.x86_64 xyz-libs-4.2.10-7.el7_2.x86_64 samba-common-libs-4.2.10-6.el7_2.x86_64 abc-4.2.11-7.el7_2.x86_64 samba-common-libs-4.2.9-8.el7_2.x86_64 abc-4.2.11-10.el7_2.x86_64 xyz-libs-4.2.11-7.el7_2.x86_64 abc-4.2.11-8.el7_2.x86_64 samba-common-libs-4.2.10-6.2.el7_2.x86_64 xyz-libs-4.2.12-7.el7_2.x86_64 xyz-libs-4.2.13-7.el7_2.x86_64 samba-common-libs-4.2.10-8.el7_2.x86_64 #### c:\@Work\Perl\monks\Anonymous Monk\1173958>perl sort_by_ver_latest_3.pl [ "samba-common-libs-4.2.12-7.el7_2.x86_64", "abc-4.2.11-10.el7_2.x86_64", "xyz-libs-4.2.13-7.el7_2.x86_64", ] ok 1 - extracted by most recent version 1..1 ok 2 - no warnings 1..2