我正在编写一个基本的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
答案 0 :(得分:1)
如toolic所评论,当您已经在此处删除不匹配的文件时:
@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";
}
}
答案 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;