Perl的opendir应该总是回归.和..首先?

ojb*_*ass 10 perl opendir

  opendir MYDIR, "$dir";
  my @FILES = readdir MYDIR;
  closedir MYDIR;
Run Code Online (Sandbox Code Playgroud)

似乎99.9%的时间数组中前两个条目总是"."和"..".如果不是这样,脚本中的后来逻辑就会出现问题.我遇到了以后出现目录条目的情况.这是否表明文件系统已损坏或其他?opendir返回的是否有已知的顺序?

Ran*_*rtz 21

它始终是操作系统的顺序,以未分类的原始方式呈现.

虽然.和...通常是前两个条目,这是因为它们是创建的前两个条目.如果由于某种原因,其中一个被删除(通过不自然的序列,因为它通常被阻止),下一个fsck(或等效的)将修复目录以再次拥有它们.这会将其中一个名称放在列表中的稍后位置.

因此,不要只是"跳过前两个条目".相反,明确匹配它们以拒绝它们.

  • 我认为他意味着必须出问题,因为它通常会被阻止.如果fsck修复它,这意味着腐败给我.我可以想象一个可能发生这种情况的实例是父目录被删除或丢失,而其内容不是(损坏或操作失败).如果它在fsck中恢复,那么这会导致稍后在它的子目录中放置"..",我想. (2认同)

Pen*_*old 8

顺序是操作系统,并且没有明确定义.

它们很容易过滤掉.

   opendir MYDIR, "$dir";
   my @FILES = grep !/^\.\.?$/, readdir MYDIR  ;
   closedir MYDIR;
Run Code Online (Sandbox Code Playgroud)

  • 是的...请注意`/^\.\.?$/`也匹配".. \n",*是*您*不想跳过的合法名称. (5认同)
  • 我会更改你的正则表达式以获得更好的可扩展性:`我的@FILES = grep!/ ^ [.] {1,2} $ /,readdir MYDIR;` (4认同)
  • @DVK我其实喜欢`^ [.] [.]?\ z`,但那时我很奇怪.只需确保使用`\ z`而不是`$`锚定在字符串的末尾. (3认同)

Sin*_*nür 6

使用File :: Slurp :: read_dir,默认情况下,返回不包含.和的列表...