4

logspath.txtマシンのログ ディレクトリ パスに含まれるファイル名があります。各行に 1 つのディレクトリ。ディレクトリは存在しますが、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

何かアドバイス?

4

3 に答える 3

10

chompに渡すことができる意味のある戻り値はありませんopendirchomp.の上の別のステートメントで文字列を指定する必要がありますopendir

 chomp;
 opendir DIR, $_ or die ...
于 2010-03-03T15:39:55.123 に答える
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 の 3 つの引数形式を使用し、開こうとしていたファイルまたはディレクトリの名前を引用符または角かっこで囲んでエラー メッセージに含め、実際にopenに渡されたものを確認します。またはopendir呼び出し。

于 2010-03-03T15:59:29.807 に答える
-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」を使用して、ディレクトリが使用可能かどうかを確認します。ディレクトリを確認すると、非常に便利です。

于 2010-03-04T05:49:01.267 に答える