首页 > 解决方案 > 今天的日期匹配不正确

问题描述

我正在编写一个基本的 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

标签: perldate

解决方案


正如 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";
    }
}

推荐阅读