Есть как минимум 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 ...).
Во-вторых, все даты модификации читаются как «Ср 31 декабря 16:00:00 1969», потому что вы передавали неверный путь к stat
.(stat($_))[9]
возвращал пустой список (потому что вы искали файл типа GLOB(0x3f9b38)status.txt
вместо правильного имени пути), и поэтому хэш фактически содержал имена файлов как ключи и значения.Первое имя файла было ключом, второе - его значением, третье - следующим ключом и так далее.localtime
преобразовывал имя файла в число (получая 0), а затем преобразовывал время эпохи 0 (1 января 1970 г. 0:00:00 UTC) в ваш часовой пояс.
В-третьих, он ожидает $path
заканчивается разделителем каталогов, и вы передаете "."
.Вам нужно будет передать "./"
, или, что еще лучше, исправить это так, чтобы функция добавляла разделитель при необходимости.
В-четвертых, grep
больше ничего не делал и должен быть удален.(В исходном коде он выбрал только определенные имена файлов, но вы изменили шаблон так, чтобы он совпадал с чем угодно.)
Что касается порядка сортировки имен файлов: get_sorted_files
возвращает список путей и времен изменения, которыеВы сохраняете в хэш %files
.keys %files
возвращает список ключей (имен файлов) и сортирует их по числовому сравнению соответствующего значения (время модификации).