有没有办法保证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
有任何方法可以达到这个目的吗?
答案 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。