【问题标题】:How do I distinguish a file from a directory in Perl?Perl 如何区分文件和目录?
【发布时间】:2010-09-17 09:44:00
【问题描述】:

我正在尝试遍历 Perl 中当前目录的所有子目录,并从这些文件中获取数据。我正在使用 grep 获取给定目录中所有文件和文件夹的列表,但我不知道返回的值中哪个是文件夹名称,哪个是没有文件扩展名的文件。

如何区分?

【问题讨论】:

    标签: perl file directory


    【解决方案1】:

    您可以使用 -d 文件测试运算符来检查某物是否是目录。以下是一些常用的文件测试运算符

    -e 文件存在。 -z 文件大小为零(为空)。 -s 文件具有非零大小(以字节为单位返回大小)。 -f 文件是一个普通文件。 -d 文件是一个目录。 -l 文件是符号链接。

    perlfunc manual page for more

    另外,请尝试使用File::Find,它可以为您递归目录。这是一个查找目录的示例....

    sub wanted {
         if (-d) { 
             print $File::Find::name." is a directory\n";
         }
    }
    
    find(\&wanted, $mydir);
    

    【讨论】:

      【解决方案2】:
      print "$file is a directory\n" if ( -d $file );
      

      【讨论】:

      • 可以使用“perldoc -f -X”找到所有文件测试函数的文档(我承认这很不直观)。
      【解决方案3】:

      查看 -X 运算符:

      perldoc -f -X
      

      对于目录遍历,请使用 File::Find,或者,如果您不是受虐狂,请使用我的 File::Next 模块,它为您创建了一个迭代器,并且不需要疯狂的回调。事实上,你可以让 File::Next 只返回文件,而忽略目录。

      use File::Next;
      
      my $iterator = File::Next::files( '/tmp' );
      
      while ( defined ( my $file = $iterator->() ) ) {
          print $file, "\n";
      }
      
      # Prints...
      /tmp/foo.txt
      /tmp/bar.pl
      /tmp/baz/1
      /tmp/baz/2.txt
      /tmp/baz/wango/tango/purple.txt
      

      http://metacpan.org/pod/File::Next

      【讨论】:

        【解决方案4】:
        我的 $dh = opendir("."); 我的@entries = grep !/^\.\.?$/, readdir($dh); 关闭$dh; foreach 我的 $entry (@entries) { 如果(-f $entry){ # $entry 是一个文件 } elsif (-d $entry) { # $entry 是一个目录 } }

        【讨论】:

          【解决方案5】:
          my @files = grep { -f } @all;
          my @dirs = grep { -d } @all;
          

          【讨论】:

            【解决方案6】:

            使用File::Find会更方便。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-04-13
              • 2012-11-21
              • 2013-11-18
              • 1970-01-01
              • 2011-04-03
              • 2011-08-04
              • 2021-07-18
              相关资源
              最近更新 更多