在Perl中有什么原因喜欢glob超过readdir(反之亦然)?

前端之家收集整理的这篇文章主要介绍了在Perl中有什么原因喜欢glob超过readdir(反之亦然)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题是从 this one的分裂。一些历史:当我第一次学习Perl,我几乎总是使用glob而不是opendir readdir,因为我发现它更容易。后来各种帖子和读数建议glob是坏的,所以现在我几乎总是使用readdir。

经过this recent question的思考,我意识到我的理由,一个或另一个选择可能是双层。所以,我将列出一些优点和缺点,我希望更有经验的Perl人可以提出和澄清。简单的问题是有强烈的理由喜欢glob到readdir或readdir到glob(在某些或所有情况下)?

glob专业版:

>没有dotfiles(除非你要求他们)
>保证物品的顺序
>无需将目录名称手动添加到项目上
>更好的名字(c’mon – glob和readdir是不是竞争,如果我们单独评价名称)
>(从ysth的回答; cf。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 cons:

>旧版本只是简单破碎(但是“老”意味着前5.6,我想,坦率地说,如果你使用pre 5.6 Perl,你有更大的问题)
>每次调用stat(即,在大多数情况下,无效使用stat)。
>目录名中的空格问题(这是否仍然是真的?)
>(从brian的回答)可以返回不存在的文件名:

$ perl -le 'print glob "{ab}{cd}"'

readdir专业:

>(从brian的回答)opendir返回一个文件句柄,你可以在你的程序中传递(和重用),但是glob只是返回一个列表
>(从brian的回答)readdir是一个合适的迭代器,并提供函数rewinddir,seekdir,telldir
>更快? (纯粹猜测基于一些glob的功能从上面我不是真的担心这个级别的优化,无论如何,但它是一个理论专业。)
>不容易发生边缘错误比glob?
>默认情况下读取所有内容(点文件)(这也是一个骗局)
>可以说服你不要命名文件0(也是 – 也见Brad的回答)
>任何人? Bueller? Bueller?

readdir缺点:

>如果你不记得添加目录名称,当你试图做文件测试或复制项目或编辑项目或者…
>如果你不记得grep出来。和..项目,你会得到位,当你计数项目,或尝试递归地向下走文件树或…
>我提到前面的目录名称? (一个sidenote,但我的第一个帖子到Perl初级邮件列表是经典的,“为什么这个代码涉及文件测试不工作在一些时间?”问题相关的这个gotcha显然,我还是苦的。
>项目没有按特定顺序返回。这意味着你经常必须记住以某种方式对它们进行排序。 (这可能是一个亲如果它意味着更多的速度,如果它意味着你实际上想想如何和如果你需要排序项目。)编辑:可怕的小样本,但在Mac readdir按字母顺序返回项,不区分大小写。在Debian框和OpenBSD服务器上,顺序是完全随机的。我测试了Mac与苹果的内置Perl(5.8.8)和我自己编译的5.10.1。 Debian框是5.10.0,和OpenBSD机器一样。我不知道这是否是一个文件系统问题,而不是Perl?
>默认读取一切(dotfiles也)(这也是一个亲)
>不一定能很好地处理一个名为0的文件(见专业人士 – 见布拉德的答案)

解决方法

你错过了它们之间最重要的,最大的区别:glob给你一个列表,但opendir给你一个目录句柄。您可以传递该目录句柄,让其他对象或子例程使用它。使用目录句柄,子例程或对象不必知道它来自哪里,谁正在使用它,等等:
sub use_any_dir_handle {
      my( $dh ) = @_;
      rewinddir $dh;
      ...do some filtering...
      return \@files;
      }

使用dirhandle,你有一个可控的迭代器,你可以用seekdir移动,虽然与glob你只是得到下一个项目。

与任何东西一样,成本和收益只适用于某一特定上下文时才有意义。它们不存在于特定用途之外。你有一个很好的他们的差异的列表,但我不会分类这些差异,而不知道你在尝试与他们做什么。

还有一些要记住的事情:

>你可以实现你自己的glob与opendir,但不是反过来。
> glob使用自己的通配符语法,这就是你得到的。
> glob可以返回不存在的文件名:

$ perl -le 'print glob "{ab}{cd}"'
原文链接:https://www.f2er.com/Perl/173533.html

猜你在找的Perl相关文章