今天日期的匹配不正确

时间:2018-11-22 16:10:07

标签: perl date

我正在编写一个基本的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 :(得分:1)

如toolic所评论,当您已经在此处删除不匹配的文件时:

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

因此,您的for循环将永远不会看到不匹配的文件。

以下是关于您的代码的其他一些注释:

  • 总是use strictuse 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";
    }
}

答案 1 :(得分:1)

您可以在标量上下文中使用@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";

另请参阅List::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;