perl - 在 Perl 中获取按修改日期排序的文件列表

标签 perl sorting date

我正在尝试获取按修改日期排序的文件列表。我修改了来自 Sort Directory and list files based on date and time 的示例程序并试图运行它。

sub get_sorted_files {
    my $path = shift;
    opendir my($dir), $path or die "can't opendir $path: $!";
    my %hash = map {$_ => (stat($_))[9]}
               map  { "$dir$_" }
               grep { m/.*/i }
               readdir $dir;
    closedir $dir;
    return %hash;
}

my %files = get_sorted_files(".");
foreach my $keys (sort{$files{$a} <=> $files{$b}} keys %files) {
    print "$keys\t", scalar localtime($files{$keys}), "\n";
}

我正在使用 Strawberry Perl 在我的 Windows XP 32 位机器上运行它版本 5.12.1.0。

Windows 上的目录列表是:

alt text

输出是:

alt text

输出对我来说没有多大意义。这段代码出了什么问题,foreach 究竟是怎么回事?循环排序文件列表?

最佳答案

该代码至少有 2 个问题。这是一个更好的版本:

use strict;
use warnings; # I bet you weren't using this, because it produced a lot

sub get_sorted_files {
   my $path = shift;
   opendir my($dir), $path or die "can't opendir $path: $!";
   my %hash = map {$_ => (stat($_))[9] || undef} # avoid empty list
           map  { "$path$_" }
           readdir $dir;
   closedir $dir;
   return %hash;
}

my %files = get_sorted_files("./");
foreach my $key (sort{$files{$a} <=> $files{$b}} keys %files) {
   print "$key\t", scalar localtime($files{$key}), "\n";
}

首先,您重命名 $dir在原代码中为$path ,但没有在 map 中改变它线。您的 $dir是一个目录句柄;这就是 GLOB(0x...) 的来源。

其次,所有修改日期都显示为“Wed Dec 31 16:00:00 1969”,因为您将错误的路径名传递给 stat . (stat($_))[9]正在返回一个空列表(因为您正在寻找像 GLOB(0x3f9b38)status.txt 这样的文件而不是正确的路径名),因此散列实际上最终包含文件名作为键和值。第一个文件名是一个键,第二个是它的值,第三个是下一个键,依此类推。 localtime正在将文件名转换为数字(产生 0),然后将纪元时间 0(1-Jan-1970 0:00:00 UTC)转换为您的时区。

三、预计$path以目录分隔符结尾,您正在传递 "." .您需要通过 "./" ,或者更好的是,修复它以便函数在需要时附加一个分隔符。

四、grep不再做任何事情,应该被删除。 (在原始代码中,它只选择了某些文件名,但您已更改模式以匹配任何内容。)

至于它如何对文件名进行排序:get_sorted_files返回路径名和修改时间的列表,您将其存储到 %files哈希。 keys %files返回键列表(文件名)并通过相关值(修改时间)的数字比较对它们进行排序。

关于perl - 在 Perl 中获取按修改日期排序的文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4651092/

相关文章:

python - 从字典中创建优先级队列

sorting - 在排序和过滤后,如何重新选中剑道网格中的复选框?

node.js - Mongoose 对日期条件的查询没有结果,MongoDB Shell 有效

r - 用c()函数强制日期的规则是什么

arrays - 一种将数组拆分为三分之二并显示给用户的干净方法

perl - 如何使用 Net::Telnet 模块在 Perl 中发送箭头键?

python - 将子进程通过管道传递到 Linux 中的文件

perl - 我应该使用 Perl 和 Tk 在 Windows 上构建 GUI 应用程序吗?

jquery - 对 div 进行排序后,悬停事件停止工作

javascript - 设置发布日期格式并添加类别