Ok, fair enough.

If it can be determined exactly what the "version" string is, then I perhaps would use an algorithm like below. One pass through the data, no sorting. Use a hash table with a key of the "generic name" and value of the version. If the version is greater, then replace the hash value with the greater version.

Of course this can become very complex in the real world because version naming conventions vary widely.

However, I think this was a successful thread in that the main issues have been discussed and some techniques demo'd. I did this quickly and perhaps there are some minor point to quibble about. But I think the general idea of this approach is solid.

#!/usr/bin/perl use warnings; use strict; my %versions; while (my $line = <DATA>) { next if $line =~ /^\s*$/; #skip blank lines $line =~ s/\s*$//; my ($name, $version, $platform) = $line =~ /^([a-zA-Z-]+)-([\d\._-]+)\.(.*)$/; # set a default value if needed. $versions{"$name:$platform"} //= "0.0.0-0"; if (cmp_verA2B ($versions{"$name:$platform"}, $version)<0) { $versions{"$name:$platform"} = $version; } } foreach my $version (sort keys %versions) #print results { my $max_ver = $versions{$version}; my ($prefix,$suffix) =split ':', $version; print "$prefix\-$max_ver\.$suffix\n"; } sub cmp_verA2B { my ($verA, $verB) = @_; my ($majorA,$minorA,$subVerA) = split /\./,$verA; my ($majorB,$minorB,$subVerB) = split /\./,$verB; my ($subVerA1, $subVerA2) = split ('-',$subVerA); my ($subVerB1, $subVerB2) = split ('-',$subVerB); $majorA <=> $majorB or $minorA <=> $minorB or $subVerA1 <=> $subVerB1 or $subVerA2 <=> $subVerB2 } =Prints: abc-4.2.11-8.el7_2.x86_64 samba-common-libs-4.2.12-7.el7_2.x86_64 xyz-libs-4.2.13-7.el7_2.x86_64 =cut __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 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

In reply to Re^5: Advanced Bubble Sort by Marshall
in thread Advanced Bubble Sort by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.