我正在尝试获取按修改日期排序的文件列表。我修改了来自 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 上的目录列表是:
输出是:
输出对我来说没有多大意义。这段代码出了什么问题,
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/