Неинициализированный также может означать инициализированный как undef
.
Операторы
stat
и -X
возвращают undef
и устанавливают $!
в случае ошибки. Давайте добавим эту проверку ошибок. В то же время я также уменьшу количество системных вызовов stat
с 2 + 2 на файл до 1 на файл.
if ($ARGV[0] eq "-d") {
die("Usage\n") if @ARGV < 2;
my $dir_qfn = $ARGV[1];
opendir(my $dh, $dir_qfn)
or die("Can't open dir \"$dir_qfn\": $!\n");
my @rows;
while (my $fn = readdir($dh)) {
next if substr($fn, 0, 1) eq '.';
my ($size, $gid, $group);
if (my @stats = stat($fn)) {
$size = $stats[7];
$gid = $stats[5];
$group = getgrgid($gid);
} else {
warn("Can't stat \"$fn\": $!\n");
$size = '???';
$gid = '???';
$group = '???';
}
push @rows, [ $fn, $size, $gid, $group ];
}
# Print rows here.
# By having all the data in an array,
# you can figure out how wide to make the columns.
}
Это просто очищенная версия вашего кода. Я еще не исправил ошибку. Но так как теперь есть проверка ошибок, мы можем увидеть, в чем проблема. Запуск программы дает нам No such file or directory
для каждого имени файла! Это потому, что вы ищете имя файла в текущем рабочем каталоге, а не в каталоге, к которому он принадлежит.
Чтобы это исправить, просто замените
if (my @stats = stat($fn)) {
...
warn("Can't stat \"$fn\": $!\n");
с
my $qfn = $dir_qfn . '/' . $fn;
if (my @stats = stat($qfn)) {
...
warn("Can't stat \"$qfn\": $!\n");