in reply to Advanced Bubble Sort

It looks to me like a standard alpha-numeric sort produces the correct order. What is needed is to select the last line in each "section". This is perhaps one way:
#!/usr/bin/perl use warnings; use strict; my @data = <DATA>; @data = sort @data; #print @data; #uncomment to see sort order my $last_line = shift @data; foreach my $line (@data) { my ($last_prefix,$last_suffix) = $last_line =~ /^([a-zA-z-]+)\d.+(\.[^\.]+)$/; my ($cur_prefix,$cur_suffix) = $line =~ /^([a-zA-z-]+)\d.+(\.[^\.]+)$/; if ( $last_prefix eq $cur_prefix and $last_suffix eq $cur_suffix) { $last_line = $line; } else { print "$last_line"; $last_line = $line; } } print "$last_line"; =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.10-6.2.el7_2.x86_64 samba-common-libs-4.2.10-8.el7_2.x86_64 samba-common-libs-4.2.12-7.el7_2.x86_64 samba-common-libs-4.2.10-6.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 xyz-libs-4.2.12-7.el7_2.x86_64 xyz-libs-4.2.13-7.el7_2.x86_64 xyz-libs-4.2.11-7.el7_2.x86_64 abc-4.2.11-7.el7_2.x86_64 abc-4.2.11-8.el7_2.x86_64 abc-4.2.11-6.el7_2.x86_64

Replies are listed 'Best First'.
Re^2: Advanced Bubble Sort
by AnomalousMonk (Archbishop) on Oct 14, 2016 at 09:24 UTC
    ... a standard alpha-numeric sort produces the correct order.

    If by "standard alpha-numeric sort" you mean a lexicographic or "asciibetic" sort (the default sort of sort), this is unfortunately not the case:

    c:\@Work\Perl\monks>perl -wMstrict -MData::Dump -le "my @ra = qw(1.2.1 1.2.2 1.2.3 1.2.10 1.2.11 1.2.20 1.2.21); my @sorted = sort @ra; dd \@sorted; " ["1.2.1", "1.2.10", "1.2.11", "1.2.2", "1.2.20", "1.2.21", "1.2.3"]
    The digit sub-fields need to be "normalized" in some way, e.g., by being zero-padded for a lexical sort comparison ('01.02.02', '01.02.20'), or by being converted to a standard number for numeric comparison (1.002_002, 1.002_020).

    Sadly, the example data of the OP does not make this problem evident.

    Update: I posted this reply before I saw Corion's post, which addresses the same problem and has a number of informative links.


    Give a man a fish:  <%-{-{-{-<

      I hear what you are saying, and this can be an issue. But in the OP's case, the default sort order does work. Yes, "12" will sort to less than "2". You are completely correct on that point.

      In this case we have a very small data example to work from. I did put in a print so the OP can see the default sort order and determine whether or not this applies more generally to his/her problem or not. Version numbers often, but not always have leading zero's or a fixed number of digits.

        In this case we have a very small data example to work from.

        A frustratingly small data sample, and if this were $work, I (and I suspect you, too) would instantly be busy calling on the phone or composing an e-mail to the "client" to answer the question "Just what the heck do you really want here?"

        ... in the OP's case, the default sort order does work.

        The legal and ethical obligations of work don't apply in this place, but I still think there is, so to speak, a "moral" obligation (appropriate to a monastery!) to offer to a supplicant defensive measures suitable to the question. After all, none of the example version numbers have leading zeros, and how did, e.g., 'abc-4.2.11-8.el7_2.x86_64' get where it is without first going through 'abc-4.2.9-8.el7_2.x86_64', and might it not yet go to 'abc-4.2.11-10.el7_2.x86_64'?

        ("I didn't get where I am today without going through 'abc-4.2.9-8.el7_2.x86_64'!" Old Reginald Perrin reference. Never mind...)


        Give a man a fish:  <%-{-{-{-<