为什么READDIR()中列出的顺序错误的文件名?(Why does readdir() list

2019-10-21 06:09发布

我使用下面的代码从目录中读取文件名,并推动他们到一个数组:

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

这是为什么代码推送的文件名到阵列的顺序,而不是从0110

Answer 1:

Unix目录没有的排序顺序存储。 Unix命令像lssh排序目录列表你,但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)) {

作为一种安全措施。)



文章来源: Why does readdir() list the filenames in wrong order?
标签: perl readdir