Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: sorting files

by toolic (Bishop)
on May 29, 2008 at 15:01 UTC ( #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 % 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

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (6)
As of 2022-11-30 23:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?