Соответствие на сегодняшнюю дату не соответствует правильно - PullRequest
0 голосов
/ 22 ноября 2018

Я пишу базовый сценарий Perl, чтобы проверить, есть ли файлы в определенных каталогах, их имена содержат сегодняшнюю дату, сценарий отлично работает, когда в каталоге есть файлы, и возвращает TRUE, но не возвращает FALSE, если нетфайлы с указанными критериями существуют

скрипт выглядит следующим образом:

#!/usr/bin/perl -w
use POSIX qw(strftime);
my $datestring = strftime "%Y%m%d", localtime;
opendir(DIR, 'C:\Perl');
@files = grep (/$datestring/,readdir(DIR));
closedir(DIR);
foreach $file (@files) {
    my $count = () = $file =~ /$datestring/;
    if ($count > 0) {
        print ("TRUE");
    }
    else 
    {
        print ("FALSE");
    }
}

имена файлов похожи на

export_opportunities_20181111-040005_20181124-040010.csv
export_opportunities_20181111-040005_20181122-040010.csv

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы можете использовать @files в скалярном контексте, чтобы узнать, вернул ли grep какие-либо совпадения из readdir.В скалярном контексте @files - количество элементов в массиве.

@files = grep (/$datestring/,readdir(DIR));
# this is more commonly written
#   @files = grep {/$datestring/} readdir(DIR);   

print @files > 0 ? "TRUE" : "FALSE";
# or
print scalar(@files)." files matched $datestring";

См. Также Список :: Util .

use v5.10;    
use List::Util qw<all any none>;
###
@files = readdir(DIR);
say 'all match' if all {/$datestring/} @files;
say 'at least one match' if any {/$datestring/} @files;
say 'no matches' if none {/$datestring/} @files;
0 голосов
/ 23 ноября 2018

Как прокомментировал инструмент, когда вы уже удаляете несоответствующие файлы здесь:

@files = grep (/$datestring/,readdir(DIR));

Следовательно, ваш цикл for никогда не будет видеть несоответствующие файлы.

Вотнесколько других комментариев к вашему коду:

  • всегда use strict и use warnings (в вашем фрагменте кода есть несколько переменных, которые не были должным образом объявлены)

  • всегда проверяйте код возврата системных вызовов, таких как opendir

  • , вы можете использовать оператор smartmatch в логическом контексте вместо назначения переменной $count

  • вам не нужно использовать скобки вокруг аргумента встроенной функции print

Вот более чистая версия вашего кода:

#!/usr/bin/perl -w
use strict;
use warnings;
use POSIX qw(strftime);

my $datestring = strftime "%Y%m%d", localtime;
opendir(DIR, 'C:\Perl') or die "cannot open dir : $!";
my @files = readdir(DIR);
closedir(DIR);

foreach my $file (@files) {
    if ($file =~ /$datestring/) {
        print "TRUE\n";
    } else {
        print "FALSE\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...