【问题标题】:how to read all file names from a given directory using perl?如何使用 perl 从给定目录中读取所有文件名?
【发布时间】:2013-03-24 11:20:41
【问题描述】:

朋友们,我有这段代码,它从目录中读取文件名并打印这些名称

opendir DIR1,  "defaults" or die "cannot open dir: $!";#open the given dir
        my @default_files=readdir DIR1;
        foreach my $fls(@default_files){ 
                        chomp($fls); 
                        print "$fls\n";
           }

当我运行上面的代码时,我得到了

.
..
PGR.csv
report.csv
std_headers.csv
tab_name.txt

很困惑前两行是什么? 提前致谢

【问题讨论】:

  • 不要chompreaddir 返回的文件名。文件名中的每个字符都对应于底层文件系统中文件的名称。相反,请使用print qq{'$fls'\n} 之类的东西,这样人们就可以用尾随换行符来区分文件名。

标签: perl foreach chomp


【解决方案1】:

更简单的替代方法是使用glob 函数:

my @default_files = glob 'defaults/*';

或者:

my @default_files = <defaults/*>;

这些函数过滤掉以 . 开头的文件和目录条目,就像 shell 一样。

【讨论】:

    【解决方案2】:

    第一行是:

    • . 链接到您当前正在访问的目录。

    • ..链接到你正在访问的目录(父目录)之上的目录。

    编辑:

    过滤掉两个命名条目的一种可能性是使用grep

    opendir DIR1, "tmp" or die "cannot open dir: $!";
    my @default_files= grep { ! /^\.\.?$/ } readdir  DIR1;
    
    foreach my $fls (@default_files) { 
       chomp($fls); 
       print "$fls\n";
    }
    

    【讨论】:

    • 可能最简单的解决方案是在阅读上面 sn-p 中给出的条目后过滤掉不需要的候选者。
    【解决方案3】:

    “。”表示当前工作目录,“..”表示当前工作目录的父目录

    【讨论】:

      【解决方案4】:

      在目录列表中,. 代表Working Directory.. 代表Parent Directory

      在标量上下文中,您可以通过显式检查这些条目来跳过它们:

      while (defined(my $next = readdir $dir)) {
          next if $next =~ /\A[.][.]?\z/;
          # ...
      }
      

      或在列表上下文中:

      my @entries = grep !/\A[.][.]?\z/, readdir $dir;
      

      如果我已经在使用File::Slurp,我更愿意只使用它提供的read_dir 函数。除了将目录路径添加到每个返回的条目之外,以下内容将自动跳过 ...

       my @paths = read_dir('/path/to/dir', prefix => 1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        相关资源
        最近更新 更多