我有一个文件夹,里面装满了文件日志。日志每周生成一次。例如。
/path/week20a.log
/path/week20b.log
/path/week29d.log
/path/week30c.log
/path/week31a.log
/path/week32a.log
我想获取上周的最新日志(上周是指这周之前上周的最新日志文件)和前一周的最新日志。在这种情况下,
/path/week21d.log
/path/week20c.log
我有两个子程序函数,看起来像:
sub getweek {
$week = ???; #where week should return one of the 'week***' listed above
my @files = File::Find::Rule->file()
->name('*$week.log')
->in(mydir);
my @files_with_mtimes = map +{ name => $_, mtime => (stat $_)[9] }, @files;
our @sorted_files = reverse sort { $a->{mtime} <=> $b->{mtime} } @files_with_mtimes;
return $sorted_files[0]{name};
}
问题是我正在使用当前周Time::Piece->new->strftime("%V")
,然后我这样做是-2
为了获得前一周。我正在硬编码,假设 2 周前的最新日志将始终存在并且将是前一个。如果上周没有跑步怎么办?在这种情况下,最后一个日志将是前一周,前一周将是前一周。
我怎么能有两个子程序,其中一个获取上周的日志,Time::Piece->new->strftime("%V")-1
如果它存在,如果不存在,则递减以查找在那之前的一周,然后基于它执行类似的操作以找到在那之前的最后一个日志。
use File::Basename qw( basename );
my @qfns = ...;
my $target_week = ...;
my %qfns_by_week;
for my $qfn (@qfns) {
my $fn = basename($qfn);
my ($week) = $fn =~ /(\d+)/
or warn("Skipping $qfn: Unrecognized format\n"), next;
next if $week > $target_week;
push @{ $qfns_by_week{$week} }, $qfn;
}
my ($week2, $week1) = sort { $b <=> $a } keys(%qfns_by_week);
my @latest_qfns;
push @latest_qfns, ( reverse sort @{ $qfns_by_week{$week1} } )[0] if defined($week1);
push @latest_qfns, ( reverse sort @{ $qfns_by_week{$week2} } )[0] if defined($week2);
请注意,最后两行假设路径和文件名的前导部分对于同一周的所有日志都相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句