2010-03-03 1 views
4

У меня есть имя файла logspath.txt, которые содержат путь к каталогу журналов на машине. один каталог каждая линия. Хотя каталог существует, Perl говорит, что нет.Не удается открыть каталог, или что случилось с моим (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 

Любые советы?

+1

От: http://perldoc.perl.org/functions/chomp.html '' Он возвращает общее количество символов, удаленных из всех его аргументов. "' –

ответ

10

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

chomp; 
opendir DIR, $_ or die ... 
4

Это должен быть комментарий, но публикация кода в комментариях на самом деле не работает, поэтому я делаю это 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.

+1

Или вы можете использовать autodie; 'и получить полезную ошибку без необходимости писать «или умереть» повсюду. – cjm

-1

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

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» используется для проверки доступности каталога. Если мы проверим каталог, это очень полезно.

+0

спасибо всем, что я узнал allot – DoronS

+0

Я не думаю, что это очень полезно использовать -d. Все, что вы сделали, делает код более сложным, без каких-либо преимуществ. Просто попробуйте opendir, и если он не сработает, обработайте этот сбой. – gorilla

Смежные вопросы