我有一个文件名数组,我必须遍历这个数组并检查所有文件的内容是否为空。
这是代码
interface
但是在上面的代码中,即使单个文件为空,iam也会返回 我想知道如何检查ALL文件的所有内容是否为空,然后返回。
所以我只想在数组中没有文件包含内容的情况下返回。
即使一个文件有内容我也不会返回
由于
答案 0 :(得分:2)
与
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 ?