为什么Perl脚本以随机顺序从目录中读取文件?

时间:2009-06-10 20:45:16

标签: perl directory

我编写了一个Perl脚本,它打开一个由各种文件组成的目录。似乎脚本不按任何顺序读取文件(既不按字母顺序也不按字母顺序),而是随机读取它们。我想知道背后的原因是什么?

4 个答案:

答案 0 :(得分:11)

它永远不会随意,它只是一种你不认识的模式。如果你查看描述你用来读取目录的任何函数的实现的文档,它可能会说,不能保证读取文件的顺序。

如果您按特定顺序需要它们,请在操作之前对名称进行排序。

文件可能以便于底层文件系统的顺序读取。因此,从某种意义上说,文件是按顺序排序的,但不是按照您期望的顺序(大小或字母)。有时,文件具有内部数字id,并且在给定此id的情况下,文件可以按数字顺序返回。但是这个id是你可能不会经常遇到的事情。

同样,结果是有序的,而不是随机的。他们只是按照你没想到的顺序。如果您需要订购,请明确订购。

另请参阅:http://www.perlmonks.org/?node_id=175864

答案 1 :(得分:10)

它可能是根据它们存储在目录文件列表中的顺序来读取它们。在某些类Unix文件系统上,该目录本质上是一个无序的文件名和inode列表,指向内容(这非常简化)。

答案 2 :(得分:4)

目录条目不按排序顺序存储,您不应该假设它们以这种方式存储。如果要对它们进行排序,则必须对它们进行排序。例如,比较输出:

perl -e 'opendir DIR, "."; print join("\n", sort readdir(DIR)); print "\n";'

perl -e 'opendir DIR, "."; print join("\n", readdir(DIR)); print "\n";'

答案 3 :(得分:2)

如果您的脚本使用opendir()(直接或间接),则不能假设它返回的文件的排序顺序;它取决于您访问的操作系统和文件系统的类型。有两种选择:

  1. 使用两个循环:一个用于读取所有文件名,第二个用于按照您需要的顺序处理它们。
  2. 使用其他命令(如调用“ls”)强制按照您需要的顺序返回文件名。