perl – 如何在目录中找到最新创建的文件?

前端之家收集整理的这篇文章主要介绍了perl – 如何在目录中找到最新创建的文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Perl中有一个优雅的方式来找到目录中的最新文件(最新的修改日期)?

到目前为止,我正在搜索我需要的文件,并为每个文件修改时间,推入一个包含文件名的数组,修改时间,然后排序。

必须有一个更好的方法

解决方法

你的方式是“正确”的方式,如果你需要排序列表(而不只是第一个,看到布赖恩的答案)。如果您不喜欢自己编写该代码,请使用 this
use File::DirList;
my @list = File::DirList::list('.','M');

我个人不会用ls -t方法 – 这涉及到划分另一个程序,它不可移植。几乎我所说的“优雅”!

关于rjray的解决办法,我稍稍改变一下:

opendir(my $DH,$DIR) or die "Error opening $DIR: $!";
my @files = map { [ stat "$DIR/$_",$_ ] } grep(! /^\.\.?$/,readdir($DH));
closedir($DH);

sub rev_by_date { $b->[9] <=> $a->[9] }
my @sorted_files = sort rev_by_date @files;

此后,@sorted_files包含排序列表,其中第0个元素是最新文件,每个元素本身包含对stat结果的引用,文件名本身在最后一个元素中:

my @newest = @{$sorted_files[0]};
my $name = pop(@newest);

这样做的优点是,如果需要,稍后更改排序方法更容易。

编辑:这是一个更容易阅读(但更长)的目录扫描版本,这也确保只有普通的文件添加到列表中:

my @files;
opendir(my $DH,$DIR) or die "Error opening $DIR: $!";
while (defined (my $file = readdir($DH))) {
  my $path = $DIR . '/' . $file;
  next unless (-f $path);           # ignore non-files - automatically does . and ..
  push(@files,[ stat(_),$path ]); # re-uses the stat results from '-f'
}
closedir($DH);

注意:对readdir()的结果的定义()的测试是因为一个名为’0’的文件会导致循环失败,如果你只测试if(my $ file = readdir($ DH))

猜你在找的Perl相关文章