Получение неинициализированной ошибки при запуске моего Perl-скрипта - PullRequest
0 голосов
/ 08 марта 2019

Я ввожу первый аргумент как «-d», а второй аргумент является каталогом, если это допустимое имя каталога.

Ниже приведен фрагмент моего кода:

if ($ARGV[0] eq "-d" && -d $ARGV[1]){
        print "File Names       Size    Owner   Group\n";
        if (-d $ARGV[1]){
            my $newdir = ARGV[1];
            opendir(DIR, $newdir) or die $!;
        while (my  $file = readdir(DIR)){
                my $filename = "$file";
                my $size = -s $filename;
                my $gid = (stat("$file"))[5];
                my $group = getgrgid($gid);
                next if ($file =~ m/^\./);
                print "$file    $size   $gid    $group\n";
        }
        closedir(DIR);
    }
}

Я пытаюсь вернуть список всех имен файлов, размера файла, владельца файла и владельца группы.Когда я выполняю скрипт, он возвращает имена файлов, но я получаю ошибки по размеру и владельцам.Конкретная ошибка:

Use of uninitialized value $gid in getgrgid at ./tester.pl line 73.
Use of uninitialized value $size in concatenation (.) or string at ./tester.pl line 75.
Use of uninitialized value $gid in concatenation (.) or string at ./tester.pl line 75.

Я не уверен, почему он указывает, что $gid и $size переменные не инициализированы

1 Ответ

2 голосов
/ 08 марта 2019

Неинициализированный также может означать инициализированный как 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...