in reply to Sorting Directory and Filenames

this code should do it:

#!/usr/bin/perl use strict; use warnings; use File::Basename; my @files; while(<>) { chomp; push @files, $_; } sub fcmp { my $res = dirname($a) cmp dirname($b); $res = basename($a) cmp basename($b) unless $res; return $res; } my @sorted = sort fcmp @files; print "$_\n" for @sorted;

Update: note that array should contain only filenames, if there are directory names it will not work correctly.

Replies are listed 'Best First'.
Re^2: Sorting Directory and Filenames
by Anonymous Monk on Jan 10, 2009 at 18:22 UTC
    i revised your code... because of the case-issue...
    #!/usr/bin/perl use strict; use warnings; use File::Basename; my @files; while(<>) { chomp; push @files, $_; } sub fcmp { my $res = lc(dirname($a)) cmp lc(dirname($b)); $res = lc(basename($a)) cmp lc(basename($b)) unless $res; return $res; } my @sorted = sort fcmp @files; print "$_\n" for @sorted;
      my @files; while(<>) { chomp; push @files, $_; }

      is a long winded way to say

      chomp( my @files = <> );

      And here's an alternate version that should be much faster for long lists:

      my @sorted = map /.*\0(.*)/s, sort map lc(dirname($_)) . "\0" . lc(basename($_)) . "\0" . $_, @files;