У меня есть массив имен файлов, и я должен пройти по этому массиву и проверить, пусто ли содержимое ВСЕХ файлов.

Вот код

foreach my $reportFile (sort { getDateInName($b) <=> getDateInName($a)} @ReportFiles)
{
   my @fileData = readFile($reportFile);
   if(!@fileData)
   {
        outputLog("FAIL: File Doesnt Contain Any Data.");
        return;
   }
}

Но в приведенном выше коде я возвращаюсь, даже если один файл пуст, я хотел бы знать, как мы можем проверить, ВСЕ ли содержимое ВСЕХ файлов пусто, а затем вернуться.

Поэтому я хотел бы вернуться только в том случае, если ни один из файлов в массиве не имеет содержимого.

Даже если в одном файле есть контент, я бы не вернулся

Благодарность

0
LearningCpp 7 Сен 2016 в 11:34

3 ответа

Лучший ответ

Используйте List::Util::all:

Подобно any, за исключением того, что он требует, чтобы все элементы @list возвращали значение BLOCK как истинное. Если какой-либо элемент возвращает 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 } @_ }
2
Zaid 7 Сен 2016 в 11:56

Попробуйте иметь логический флаг, который устанавливается в единицу, если у вас есть контент хотя бы в одном файле, чтобы вам не приходилось проходить через массив и возвращаться, как только вы найдете файл с контентом И если в нем нет контента файл, перейдите к следующей итерации, чтобы проверить, доступно ли содержимое. И выйти из цикла, если контент присутствует в любом из файлов

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 ?
-1
user2256825 7 Сен 2016 в 09:57

Во-первых, если вы хотите только проверить, является ли файл пустым, вам не следует пытаться его прочитать. Это может быть опасно, так как вы можете прочитать в памяти огромный файл. Вы можете проверить, является ли файл пустым, например if (-s $reportFile) {...}. Во-вторых, чтобы решить проблему с возвратом, если какой-либо файл пуст, вам необходимо инвертировать логику вашего кода, т.е. вы должны проверить, не ли какой-либо файл. Это происходит из-за следующей логической эквивалентности: сказать, что «все файлы пусты» - это то же самое, что «ни один файл не является непустым». Собирая все вместе, получаем что-то вроде этого:

sub all_empty {
    foreach my $reportFile (sort { getDateInFileName($b) <=> getDateInName($a)} @ReportFiles)
    {
       if (-s $reportFile) {
           return 0;
       }
    }
    return 1;
}
1
redneb 7 Сен 2016 в 09:45