http://qs1969.pair.com?node_id=689033


in reply to sorting files

You might want to clarify your requirements a little by providing a few example input filenames and the expected output (contents of your @TXT array).

I have made a few changes to your script:

Here is the code:

use strict; use warnings; use File::Copy; sub files_sort { my $first_number; my $second_number; my $re = qr/(\d+)_\d+_duration_\w+_comptage_\d+.txt$/; if ($a =~ $re) { $first_number = $1; } if ($b =~ $re) { $second_number = $1; } if ($first_number < $second_number) { -1 } elsif ($first_number > $second_number) { 1 } else { 0 } } my @TXT = glob("*.txt"); @TXT = sort files_sort @TXT; print "$_\n" for @TXT;

Here is the output:

% ls -1 *.txt A3_output_ZGZ22_03_20061022_duration_200mn_comptage_60.txt M3_output_ZGZ22_02_20061022_duration_200mn_comptage_60.txt M3_output_ZGZ22_12_20051022_duration_200mn_comptage_60.txt M3_output_ZGZ22_12_20061022_duration_200mn_comptage_60.txt % 689020.pl M3_output_ZGZ22_02_20061022_duration_200mn_comptage_60.txt A3_output_ZGZ22_03_20061022_duration_200mn_comptage_60.txt M3_output_ZGZ22_12_20051022_duration_200mn_comptage_60.txt M3_output_ZGZ22_12_20061022_duration_200mn_comptage_60.txt

Is this what you expect?

Caveat: you must make sure that all the *.txt files in your directory match your regex.

Replies are listed 'Best First'.
Re^2: sorting files
by GrandFather (Saint) on May 29, 2008 at 20:04 UTC

    I'd rewrite the sub as:

    sub files_sort { my $re = qr/(\d+)_\d+_duration_\w+_comptage_\d+.txt$/; my $first_number = $a =~ $re ? $1 : -1; my $second_number = $b =~ $re ? $1 : -1; return $first_number <=> $second_number; }

    which is slightly more compact and deals better with bad matches by avoiding comparing undefined values. Explicit returns are good too.


    Perl is environmentally friendly - it saves trees