У меня есть массив имен файлов, и я должен пройти по этому массиву и проверить, пусто ли содержимое ВСЕХ файлов.
Вот код
foreach my $reportFile (sort { getDateInName($b) <=> getDateInName($a)} @ReportFiles)
{
my @fileData = readFile($reportFile);
if(!@fileData)
{
outputLog("FAIL: File Doesnt Contain Any Data.");
return;
}
}
Но в приведенном выше коде я возвращаюсь, даже если один файл пуст, я хотел бы знать, как мы можем проверить, ВСЕ ли содержимое ВСЕХ файлов пусто, а затем вернуться.
Поэтому я хотел бы вернуться только в том случае, если ни один из файлов в массиве не имеет содержимого.
Даже если в одном файле есть контент, я бы не вернулся
Благодарность
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 } @_ }
Попробуйте иметь логический флаг, который устанавливается в единицу, если у вас есть контент хотя бы в одном файле, чтобы вам не приходилось проходить через массив и возвращаться, как только вы найдете файл с контентом И если в нем нет контента файл, перейдите к следующей итерации, чтобы проверить, доступно ли содержимое. И выйти из цикла, если контент присутствует в любом из файлов
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 ?
Во-первых, если вы хотите только проверить, является ли файл пустым, вам не следует пытаться его прочитать. Это может быть опасно, так как вы можете прочитать в памяти огромный файл. Вы можете проверить, является ли файл пустым, например if (-s $reportFile) {...}
. Во-вторых, чтобы решить проблему с возвратом, если какой-либо файл пуст, вам необходимо инвертировать логику вашего кода, т.е. вы должны проверить, не ли какой-либо файл. Это происходит из-за следующей логической эквивалентности: сказать, что «все файлы пусты» - это то же самое, что «ни один файл не является непустым». Собирая все вместе, получаем что-то вроде этого:
sub all_empty {
foreach my $reportFile (sort { getDateInFileName($b) <=> getDateInName($a)} @ReportFiles)
{
if (-s $reportFile) {
return 0;
}
}
return 1;
}
Похожие вопросы
Новые вопросы
perl
Perl - это процедурный высокоуровневый динамический язык программирования общего назначения, известный своей собственной поддержкой регулярных выражений и возможностей синтаксического анализа строк. Пожалуйста, используйте этот тег для вопросов о Perl в целом. Для вещей, связанных с новым (но связанным) языком Raku (ранее «Perl 6»), используйте тег raku. Для регулярных выражений в стиле Perl на других языках используйте тег regex или, если они основаны на библиотеке PCRE, тег pcre.