我使用以下代码从目录中读取文件名并将其推送到数组:
#!/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
?
答案 0 :(得分:3)
Unix目录不按排序顺序存储。像ls
和sh
这样的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)) {
作为安全措施。)