为什么readdir()以错误的顺序列出文件名?

时间:2014-11-11 15:03:20

标签: perl readdir

我使用以下代码从目录中读取文件名并将其推送到数组:

#!/usr/bin/perl

use strict;
use warnings;

my $directory="/var/www/out-original";
my $filterstring=".csv";
my @files;
# Open the folder
opendir(DIR, $directory) or die "couldn't open $directory: $!\n";

foreach my $filename (readdir(DIR)) {
    if ($filename =~ m/$filterstring/) {
        # print $filename;
        # print "\n";
        push (@files, $filename);
    } 
}
closedir DIR;

foreach my $file (@files) {
    print $file . "\n";
}

运行此代码得到的输出是:

Report_10_2014.csv
Report_04_2014.csv
Report_07_2014.csv
Report_05_2014.csv
Report_02_2014.csv
Report_06_2014.csv
Report_03_2014.csv
Report_01_2014.csv
Report_08_2014.csv
Report.csv
Report_09_2014.csv

为什么此代码按此顺序将文件名推送到数组中,而不是从01推送到10

1 个答案:

答案 0 :(得分:3)

Unix目录不按排序顺序存储。像lssh这样的Unix命令为你排序目录列表​​,但是Perl的opendir函数没有;它以与内核相同的顺序返回项目,这是基于它们存储的顺序。如果你想要对结果进行排序,你需要自己做:

for my $filename (sort readdir(DIR)) {

(顺便说一句:裸字文件句柄,如DIR,是全局变量;使用词法文件句柄被认为是一种好习惯,例如:

opendir my $dir, $directory or die "Couldn't open $directory: $!\n";
for my $filename (sort readdir($dir)) {

作为安全措施。)