我有一个目前正在使用while循环处理的目录。文件名实际上是日期:
updates.20130831.1445.hr
updates.20140831.1445.hr
updates.20150831.1445.hr
updates.20160831.1445.hr
updates.20170831.1445.hr
但是,在我的print语句中,我注意到while循环不是从第一个文件开始的。而选择第二或第五等。
如果while循环是顺序的,为什么第一个文件不会先处理,然后是第二个,第三个等?我错过了什么吗?
我的while循环是这样的:
opendir(DIRECTORY, $Dir) or die $!;
while (my $file = readdir(DIRECTORY)) {
print "$file
open (IN, $file) or die "error reading file: ", $file,"\n"
答案 0 :(得分:4)
readdir
内置版不保证任何订单,因此您必须手动对名称进行排序:
for my $file (sort readdir DIRECTORY) { ... }
请注意,readdir
不会输出完整路径,因此如果要打开该文件,则必须预先添加目录名称:
my $path = "$dir/$file";
请注意,条目可以是各种文件系统对象,包括文件,目录,符号链接和命名管道。在尝试打开文件之前,您应该跳过那些不是文件的文件:
next if not -f $path;
如果您要处理目录,请考虑readdir
输出包括.
和..
目录(当前和父目录),您应该总是过滤掉它们:
next if $file eq "." or $file eq "..";
答案 1 :(得分:3)
如果您希望对它们进行排序 - 请对它们进行排序。
opendir
等按文件存储在磁盘上的顺序提取文件。不是字母。它不保证订单
答案 2 :(得分:3)
询问while
是否连续是没有意义的。 while
循环(在任何C语言中)只是重复执行一个块,直到特定条件测试为假。
如果我将钉子钉入木块中,可以将其描述为“当钉子突出时,用锤子击打”。询问我的锤击是否按照正确的顺序进行检查真的没有意义。
有意义地询问它们是否是顺序的构造是在有序数据结构上操作的东西,例如数组或列表。例如,grep
,map
和foreach
。这些都在Perl中按顺序运行。
问及“是readdir()
以任何特定顺序返回结果有什么意义?”这个问题的答案是确实如此,但它不是一个特别有用的顺序 - 当然不是字母/词典顺序。如果您希望按特定顺序列出文件,则应将readdir()
置于数组中,然后sort
该数组。