Perl readdir按顺序排列

时间:2013-05-28 13:13:54

标签: perl sorting directory readdir

有没有办法保证readdir返回的列表中的订单?

我有代码:

opendir(my $DIR, $src) or die "Error opening $src";

# Loop for each file in the directory
while (my $file = readdir($DIR))
{
        print "$file\n";
    }

但它以随机顺序返回。现在我知道通过快速谷歌搜索有很多解决方案,但我找不到我需要的确切顺序。 基本上我希望文件夹显示为FIRST或LAST,而不是文件之间。

例如,现在如果我有文件夹结构:

folder
folder
file1
file2
file3

我得到了结果:

file2
folder
folder
file1
file3

我真的想要的时候:

folder
folder
file1
file2
file3

或者:

file1
file2
file3
folder
folder

有任何方法可以达到这个目的吗?

4 个答案:

答案 0 :(得分:5)

您可以使用sort来查看readdir返回的列表中的每个条目。

opendir(my $DIR, '.') or die "Error opening ";

foreach my $file (sort { -d $a <=> -d $b } readdir($DIR)) {
  print "$file\n";
}

这将最后提供文件夹。

答案 1 :(得分:5)

您可以先放置文件夹,然后按文件/目录名称

排序
# $src pointing to folder open with opendir
my @sorted_dir = 
  map $_->[0],
  sort {
    $a->[1] <=> $b->[1]
      ||
    $a->[0] cmp $b->[0]
  }
  map [ $_, -f "$src/$_" ],
  readdir($DIR);

虽然可以实现类似的效果,

for my $file (sort { -f "$src/$a" <=> -f "$src/$b" } readdir($DIR)) {
  print "$file\n";
}

它更慢,效率更低,因为如果目录条目是普通文件,它通常用于文件系统检查。

答案 2 :(得分:4)

foreach (sort readdir $dh) {}对我来说很好。

例如:

opendir (my $DIR, "$dir") || die "Error while opening $dir: $!\n";

foreach my $dirFileName(sort readdir $DIR)
{
      next if $dirFileName eq '.' or $dirFileName eq '..';
      print("fileName: $dirFileName ... \n");
}

答案 3 :(得分:2)

您可以使用List::MoreUtils

中的part
#!/usr/bin/env perl

use strict;
use warnings;

use List::MoreUtils 'part';

my $dir = shift || '.';

opendir my $dh, $dir or die "Cannot open $dir";

my ($files, $dirs) = part { -d } sort readdir $dh;

print "$_\n" for @$files, @$dirs;

另一个想法是,您可以查看File::Next