【问题标题】:Can't open directory, or what's wrong with my (Perl) code?无法打开目录,或者我的(Perl)代码有什么问题?
【发布时间】:2011-01-23 06:34:29
【问题描述】:

我有一个文件名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

有什么建议吗?

【问题讨论】:

标签: perl opendir


【解决方案1】:

chomp 没有有意义的返回值,您可以将其传递给opendir。您需要在 opendir 上方的单独语句中将您的字符串 chomp

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

【讨论】:

    【解决方案2】:

    这应该是一条评论,但在 cmets 中发布代码并没有真正起作用,所以我将其设为 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 的三个参数形式,并将您尝试打开的文件或目录的名称包含在引号或括号中的错误消息中,以查看是什么实际上传递给openopendir 调用。

    【讨论】:

    • 或者您可以use autodie; 并获得有用的错误消息,而不必到处写“或死”。
    【解决方案3】:

    使用严格; 使用警告;

        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”用来检查目录是否可用。如果我们检查目录,它非常有用。

    【讨论】:

    • 我不认为以这种方式使用 -d 很有用。您所做的只是使代码更复杂,没有任何好处。只需尝试 opendir,如果失败,则处理该失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多