Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Re: sorting files

by toolic (Bishop)
on May 29, 2008 at 15:01 UTC ( [id://689033]=note: print w/replies, xml ) Need Help??

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:

  • Added use warnings;
  • Stored the regex in a variable, $re, to avoid duplication.
  • Removed the unnecessary capturing parentheses from the regex; since you are only using $1, you only need 1 set.
  • Check $first_number instead of $1. Same for $2.

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 % 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

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://689033]
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (5)
As of 2024-04-25 10:42 GMT
Find Nodes?
    Voting Booth?

    No recent polls found