【问题标题】:Checking to see if any .txt files exist in a directory using a Perl script使用 Perl 脚本检查目录中是否存在任何 .txt 文件
【发布时间】:2015-10-18 02:20:50
【问题描述】:

我有一个目录,/home/textfile/

我想使用 Perl 脚本检查此目录中是否存在 *.txt 文件。如果他们这样做,我想让它说“文本文件存在”。否则,如果目录中没有文本文件,我希望它说“不存在文本文件”。

文本文件可以有任何名称。我只想检查该目录中是否有文本文件,/home/textfile

下面是我尝试使用的脚本:

$filedir = "/home/textfile/";
chdir($filedir);
if (-e "`ls *.txt`")
{
    print STDOUT "Text file exist"
}
else
{
    print STDOUT "No text file exist"
}

我怎样才能修复这个脚本,以便它可以做我想要做的事情?

【问题讨论】:

    标签: perl file


    【解决方案1】:

    最简单的方法是使用glob 获取该目录中所有以.txt 结尾的文件的列表。它避免了使用ls

    这样

    use strict;
    use warnings;
    
    my $dir = '/home/textfile';
    my @files = glob "$dir/*.txt";
    
    print "No " unless @files;
    print "Text file exist\n";
    

    【讨论】:

      【解决方案2】:

      来自perldoc 关于 -X 文件测试操作符:

      文件测试,其中 X 是下面列出的字母之一。这个一元 运算符接受一个参数,文件名、文件句柄或 dirhandle,并测试关联的文件以查看是否为真 关于它。

      在将ls 命令用双引号括起来时,您希望测试ls 返回的文件名,但实际上您是在测试名为'ls *.txt' 的文件是否存在。

      有几个选项。您可以在单独的步骤中使用ls 来获取所有文本文件名,然后测试是否存在单个文件名。

      my @text_files = `ls *.txt`;
      chomp(@text_files);
      
      if ( -e $text_files[0] ) {
         ...
      }
      else {
         ...
      }
      

      但由于ls返回现有文件,因此根本不需要-e 此处的检查。你可以简单地说:

      my @text_files = `ls *.txt`;
      if ( @text_files ) {
          print "Text file exist"
      }
      else {
          print "No Text file exist"
      }
      

      我还应该注意,由于您没有在 ls 命令中使用 $dir,因此您实际上并不是在查看 $dir 目录,而是当前工作目录。您需要将$dir 添加到ls 命令:

      my @text_files = `ls $dir/*.txt`;
      if ( @text_files ) {
          print "Text file exist"
      }
      else {
          print "No Text file exist"
      }
      

      或者,您可以使用 glob 内置函数而不是使用 ls 并让 Perl 管理如何实际读取文件。这通常是更健壮和可维护的解决方案:

      my @text_files = glob("$dir/*.txt");
      if ( @text_files ) {
          print "Text file exist"
      }
      else {
          print "No Text file exist"
      }
      

      【讨论】:

        猜你喜欢
        • 2012-06-04
        • 2022-11-21
        • 2018-12-08
        • 2017-07-14
        • 1970-01-01
        • 2015-03-05
        • 2018-10-01
        • 2014-04-13
        • 2022-11-23
        相关资源
        最近更新 更多