8

有什么办法可以保证从返回的列表中获得订单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";
    }

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

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

folder
folder
file1
file2
file3

我得到结果:

file2
folder
folder
file1
file3

当我真的想要:

folder
folder
file1
file2
file3

或者:

file1
file2
file3
folder
folder

有什么办法可以做到这一点?

4

4 回答 4

6

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

# $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";
}

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

于 2013-05-28T13:30:36.107 回答
5

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");
}
于 2015-03-19T13:18:29.037 回答
5

您可以使用 asort来执行此操作,方法是查看由 . 返回的列表的每个条目readdir

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

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

这将最后提供文件夹。

于 2013-05-28T13:26:05.880 回答
2

您可以使用partList ::MoreUtils

#!/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

于 2013-05-28T13:29:13.557 回答