in reply to Sorting array

If you don't care that the output array is in numerical order (like your desired output), it can be a one-liner - hehehe

#!/usr/bin/perl # http://perlmonks.org/?node_id=1177217 use strict; use warnings; my @ar1 = qw(text1.txt text1a.txt text2.txt text54.txt text1g.txt text54f.txt); my @lastversion = values %{{ map { /(\d+)/, $_ } sort @ar1 }}; print "@lastversion\n";

Replies are listed 'Best First'.
Re^2: Sorting array
by negativ_m (Novice) on Dec 06, 2016 at 13:19 UTC

    Hello,

    First I want to thank you a lot for this elegant solution. I tested your code on a real life case and for some reason it doesn't work.

    Here is the code:

    #!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; my @ar1=qw(F40_I_VBBG_RI50-FMVSS301n-2SR424M-HCH-D_01EK101.a3db F40_I_VBBG_RI50-FMVSS301n-2SR424M-HCH-D_01EK101a.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101g.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101k.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101.a3db ); #my @lastversion = values %{{ map { /EK(\d+)\w?/, $_ } sort @ar2 }}; my %latest; @latest{ /EK(\d+)\D/ } = $_ for sort @ar1; my @lastversion = @latest{sort {$a <=> $b} keys %latest}; foreach (@lastversion) { #print "@lastversion\n"; print "$_\n"; } #print Dumper(\%latest);

    The correct output should be this:

    F40_I_VBBG_RI50-FMVSS301n-2SR424M-HCH-D_01EK101a.a3db

    F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101k.a3db

    After i run the script i just get the first name:

    F40_I_VBBG_RI50-FMVSS301n-2SR424M-HCH-D_01EK101a.a3db.

    I really can't tell what the problem is. I am asking again for your help.

    Thank you in advance.

      I really can't tell what the problem is

      This regex /EK(\d+)\D/ captures only the numerics after the EK which is 101 for all the records. Expand the regex to capture the full key (less the last suffix letter if present).

      #!/usr/bin/perl -w use strict; use warnings; my @ar1 = qw( F40_I_VBBG_RI50-FMVSS301n-2SR424M-HCH-D_01EK101.a3db F40_I_VBBG_RI50-FMVSS301n-2SR424M-HCH-D_01EK101a.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101g.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101k.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101.a3db ); my %latest; for (sort @ar1){ if (/(.*?)[a-z]?\.a3db/){ $latest{$1} = $_; } else { warn "No match for $_"; } } print "$_\n" for reverse sort values %latest;
      poj

      I really can't tell what the problem is.
      The problem is you gave fake data for your problem instead of real data.

      fake data => fake solution

      (not to mention wasting time).

      #!/usr/bin/perl -l # http://perlmonks.org/?node_id=1177217 use strict; use warnings; my @ar1=qw(F40_I_VBBG_RI50-FMVSS301n-2SR424M-HCH-D_01EK101.a3db F40_I_VBBG_RI50-FMVSS301n-2SR424M-HCH-D_01EK101a.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101g.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101k.a3db F40_I_VBBG_LR50-ECR17p-2SR424M-HCH-D_01EK101.a3db ); print for values %{{ map { /(.*\d)[a-z]?\./, $_ } sort @ar1 }};