# These constants make the code below more readable. # use constant { IX_FILENAME => 0, IX_RUN => 1, IX_DISTRICT => 2, IX_COPY => 3, IX_TOTAL => 4, }; # Read this bit from bottom to top: # my @sorted = # Now we've sorted our arrayrefs by the fields we're interested in # we loop through them again, pulling out just the filename and # discarding the other parts. map { $_->[IX_FILENAME] } # Sort by the fields we're interested in. Note that if the two # values for RUN are different, this will sort by them, and everyt +hing # following the first 'or' is ignored. If they're the same, that # comparison returns 0, so the stuff after 'or' isn't ignored, # and we compare by DISTRICT, then COPY, then TOTAL. sort { $a->[IX_RUN] <=> $b->[IX_RUN] or $a->[IX_DISTRICT] <=> $b->[IX_DISTRICT] or $a->[IX_COPY] <=> $b->[IX_COPY] or $a->[IX_TOTAL] <=> $b->[IX_TOTAL] } # For each filename, split it into an arrayref, so that the first # element in the arrayref is the filename itself, and the rest are # the fields we're interested in. map { [ $_, m/\A[A-Z0-9]+_([0-9])+_ETSTexas_.*_Candidate_RRD_([0-9]+ +)_([0-9]{2})_([0-9]{2})/i ] } # Take our list of filenames… @files; # Check it works. (It does.) # print Dumper(\@sorted);
In reply to Re: Sorting files by 3 numbers in the name
by tobyink
in thread Sorting files by 3 numbers in the name
by crusty_collins
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |