这个问题是从这个问题衍生出来的。一些历史:当我第一次学习 Perl 时,我几乎总是使用glob而不是opendir+ readdir,因为我发现它更容易。后来各种帖子和阅读表明这glob很糟糕,所以现在我几乎总是使用readdir.
在考虑了最近的这个问题后,我意识到我选择一个或另一个的原因可能是愚蠢的。所以,我将列出一些优点和缺点,我希望更有经验的 Perl 人员能够加入并澄清。简而言之,问题是是否有令人信服的理由偏爱glob或readdir(readdir在glob某些或所有情况下)?
glob优点:
- 没有点文件(除非你要求他们)
- 保证物品顺序
- 无需手动将目录名称添加到项目上
- 更好的名字(来吧 -如果我们仅凭名字来判断,那就没有竞争了
glob)readdir (来自 ysth 的回答;参见
glob下面的 cons 4)可以返回不存在的文件名:@deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";
glob缺点:
- 旧版本只是简单的损坏(但“旧”是指 5.6 之前的版本,我认为,坦率地说,如果你使用的是 5.6 之前的 Perl,你会遇到更大的问题)
stat每次调用(即stat在大多数情况下无用使用)。- 目录名称中的空格问题(这仍然是真的吗?)
(来自布赖恩的回答)可以返回不存在的文件名:
$ perl -le 'print glob "{ab}{cd}"'
readdir优点:
- (来自布赖恩的回答)
opendir返回一个文件句柄,您可以在程序中传递(并重用),但glob只返回一个列表 - (来自布赖恩的回答)
readdir是一个合适的迭代器,并提供函数到rewinddir,seekdir,telldir - 快点?(基于上面的一些
glob特性的纯粹猜测。无论如何我并不担心这种优化水平,但它是一个理论上的专业人士。) - 比 ? 更不容易出现边缘情况错误
glob? - 默认情况下读取所有内容(也是点文件)(这也是一个骗局)
- 可能会说服您不要命名文件
0(也是一个骗局 - 参见布拉德的回答) - 任何人?布勒?布勒?
readdir缺点:
- 如果您不记得添加目录名称,当您尝试进行文件测试或复制项目或编辑项目或...
- 如果你不记得
grep出.和..项目,当你计算项目时你会得到一点,或者尝试递归地沿着文件树走或者...... - 我有没有提到在目录名称前面加上前缀?(旁注,但我在 Perl Beginners 邮件列表中的第一篇文章是经典的,“为什么涉及文件测试的代码在某些时候不起作用?”与这个问题相关的问题。显然,我仍然很痛苦。)
- 退回的物品没有特定的顺序。这意味着您通常必须记住以某种方式对它们进行排序。(如果它意味着更快的速度,并且如果它意味着您真正考虑如何以及是否需要对项目进行排序,这可能是一个专业人士。)编辑:非常小的样本,但在 Mac
readdir上按字母顺序返回项目,不区分大小写。在 Debian 机器和 OpenBSD 服务器上,顺序是完全随机的。我用 Apple 的内置 Perl (5.8.8) 和我自己编译的 5.10.1 测试了 Mac。Debian 机器是 5.10.0,OpenBSD 机器也是。我想知道这是否是文件系统问题,而不是 Perl? - 默认情况下读取所有内容(也是点文件)(这也是专业人士)
- 不一定能很好地处理名为的文件
0(另见专业人士 - 见布拉德的回答)