这个问题是从这个问题衍生出来的。一些历史:当我第一次学习 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
(另见专业人士 - 见布拉德的回答)