gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:13:13 26 4
gpt4 key购买 nike

我正在尝试获取按修改日期排序的文件列表。我修改了来自 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com