使用Perl对目录文件名进行排序

sup*_*fry 2 sorting perl

我想按名称对目录中的文件进行排序/打印.我的代码列出了所有代码,但排序是偏斜的.这是我的代码和结果.任何建议都将受到欢迎!

my $file;
opendir (DIR, "$dir");
while ($file = readdir(DIR)) {
    push (my @files, $file);
    @files = sort {$a cmp $b} @files;   #NOT sorting!
    foreach $file (@files) {
        print "$file\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是"排序"结果:

Screenshot-Chess_-_Human_versus_GNUchess.png  
test.html  
katyperry.gif  
test.cgi  
Californication.S04E05.HDTV.XviD-ASAP.avi  
FreeWatch_13.exe  
proxy.jpg  
test.pl-  
.  
attachment2.jpg  
attachment.jpg  
Californication.S04E06.HDTV.XviD-LOL.avi  
Californication.S04E07.HDTV.XviD-LOL.avi  
boxter.jpg  
..  
Run Code Online (Sandbox Code Playgroud)

Ano*_*mie 11

您正在构建一系列单元素列表,对每个列表进行排序(这是一个无操作)并打印它.你想要做的是将整个文件列表读入一个列表,然后对其进行排序,如下所示:

my $file;
my @files;
opendir (DIR, "$dir");
while ($file = readdir(DIR)) {
    push (@files, $file);
}
@files = sort {$a cmp $b} @files;
foreach $file (@files) {
    print "$file\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,用`@files = readdir(DIR)`替换`while`循环. (4认同)
  • @ andy-lester:就此而言,`print join("\n",sort {$ a cmp $ b} readdir(DIR))."\n";` (4认同)

too*_*lic 5

另一种方法,使用File :: Slurp

use warnings; 
use strict; 
use File::Slurp;
use Data::Dumper;

my @files = read_dir($dir);
@files = sort @files;
print Dumper(\@files);
Run Code Online (Sandbox Code Playgroud)

这将负责打开和关闭目录,检查是否成功,并自动排除特殊.和...目录,你可能不想要.