Не удается открыть каталог, или что не так с моим (Perl) кодом? - PullRequest
4 голосов
/ 03 марта 2010

У меня есть имя файла logspath.txt, которое содержит путь к журналу на компьютере. один каталог в каждой строке. Хотя каталог существует, Perl говорит, что его нет.

#!/usr/bin/perl -w

open FILE,"logspath.txt" or die $!;
while (<FILE>){
   print $_;
   opendir ($DIR,chomp($_)) or die $!;

Когда я запускаю скрипт, я получаю:

/home/amosa/
No such file or directory at archive.pl line 6, <FILE> line 1.

Список каталога:

~$ ls -l /home/amosa/
total 6
drwxr-xr-x  11 amosa    prodapp     1024 Mar  2 12:49 deploy
drwxr-xr-x   2 amosa    prodapp      512 Mar  2 12:39 lib
-rw-r--r--   1 amosa    prodapp      787 Mar  2 11:02 s

Любой совет?

Ответы [ 3 ]

10 голосов
/ 03 марта 2010

chomp не имеет значимого возвращаемого значения, которое вы затем можете передать на opendir. Вам нужно chomp вашей строки в отдельном выражении, выше opendir.

 chomp;
 opendir DIR, $_ or die ...
4 голосов
/ 03 марта 2010

Это должен быть комментарий, но размещение кода в комментариях на самом деле не работает, поэтому я делаю это CW.

Вот как написать «лучше» для некоторого значения лучше:

#!/usr/bin/perl

use strict; use warnings;

my $logs_file = 'logspath.txt';

open my $FILE, '<', $logs_file
    or die "Cannot open '$logs_file': $!";

while ( my $dir = <$FILE> ) {
    print $dir and chomp $dir;
    opendir my $dir_h, $dir
        or die "Cannot open directory '$dir': $!";
    # do something with $dir_h
}

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

0 голосов
/ 04 марта 2010

использовать строгое; используйте предупреждения;

    open my $FILE, '<logspath.txt'
     or die "Cannot open '$logs_file': $!";

    while ( my $dir = <$FILE> ) {
        print $dir and chomp $dir;
            if( -d $dir)
            {
        opendir my $dir_h, $dir
            or die "Cannot open directory '$dir': $!";
        # do something with $dir_h
    }
     else
{
     print " Can't open directory $!\n";
}
}

Здесь «-d» используется для проверки наличия или отсутствия каталога. Если мы проверим каталог, это очень полезно.

...