如何通过遍历文件名数组来检查文件内容是否为空

时间:2016-09-07 08:34:47

标签: perl perl-data-structures

我有一个文件名数组,我必须遍历这个数组并检查所有文件的内容是否为空。

这是代码

interface

但是在上面的代码中,即使单个文件为空,iam也会返回 我想知道如何检查ALL文件的所有内容是否为空,然后返回。

所以我只想在数组中没有文件包含内容的情况下返回。

即使一个文件有内容我也不会返回

由于

3 个答案:

答案 0 :(得分:2)

使用List::Util::all

  

any类似,但它要求@list的所有元素都使BLOCK返回true。如果任何元素返回false,则返回false。如果BLOCK从不返回false或@list为空,则返回true。

use List::Util 'all';

sub check_files {
  ...
  warn( "All files empty" ), return
    if all { -z } @_;
  ...
}

sub are_all_empty { all { -z } @_ }

答案 1 :(得分:1)

首先,如果您只想检查文件是否为空,则不应尝试阅读。这可能很危险,因为你最终可能会在内存中读取一个巨大的文件。您可以像if (-s $reportFile) {...}一样测试文件是否为空。其次,要修复返回的问题,如果任何文件为空,则需要反转代码的逻辑,即必须检查是否有任何文件为空。这是因为以下逻辑等价:说“所有文件都是空的”与“no file is nonempty”相同。总而言之,你会得到类似的东西:

sub all_empty {
    foreach my $reportFile (sort { getDateInFileName($b) <=> getDateInName($a)} @ReportFiles)
    {
       if (-s $reportFile) {
           return 0;
       }
    }
    return 1;
}

答案 2 :(得分:-1)

尝试使用布尔标志,如果你在至少一个文件中有内容,则设置为1,这样你就不必遍历数组并在找到包含内容的文件时立即返回     如果文件中没有内容,请转到下一次迭代以检查内容是否可用。     如果内容存在于任何文件

中,则退出循环
my $isFileEmpty = 0 ;
foreach my $reportFile (sort { getDateInFileName($b) <=> getDateInName($a)} @ReportFiles)
{
    my @fileData = readFile($reportFile);
   if(@fileData) {
      $isFileEmpty = 1;
      last;     
   }
   else {
      next ; 
    } 
}
if($isFileEmpty eq 0)
{

    return;

}


PS : Do you have content available in most of the cases ?