2

ディレクトリ内の通常のファイルを反復処理し、まとめたすべてのファイルの合計サイズを計算する単純な perl スクリプトを作成しようとしています。ただし、ファイルの実際のサイズを取得できず、その理由がわかりません。コードの関連部分を次に示します。デバッグ用に print ステートメントを挿入しました。

$totalsize = 0;
while ($_ = readdir (DH)) {
   print "current file is: $_\t";
   $cursize = -s $_;           
   print "size is: $cursize\n";
   $totalsize += $cursize;
}  

これは私が得る出力です:

current file is: test.pl    size is: 
current file is: prob12.pl  size is: 
current file is: prob13.pl  size is: 
current file is: prob14.pl  size is: 
current file is: prob15.pl  size is: 

したがって、ファイルサイズは空白のままです。$cursize = $_代わりに使用してみましたが、その唯一の効果は、現在のディレクトリと親ディレクトリのファイルサイズをそれぞれ 4096 バイトとして取得することでした。通常のファイルの実際のファイルサイズはまだ取得されていません。

私はオンラインで、perl に関するいくつかの本を調べましたが、スクリプトがファイルを読み取ることができないため、perl はファイル サイズを取得できないようです。ifステートメントを入れてこれをテストしました:

print "Cannot read file $_\n" if (! -r _);

案の定、ファイルごとに、ファイルを読み取れないというエラーが表示されました。なぜこれが起こっているのかわかりません。問題のファイルがあるディレクトリはホーム ディレクトリのサブディレクトリであり、ホーム ディレクトリの別のサブディレクトリから自分自身としてスクリプトを実行しています。関連するすべてのファイルに対する読み取り権限があります。ファイルのモードを (以前の 711 から) 755 に変更しようとしましたが、それでもCannot read file各ファイルの出力が得られました。

何が起こっているのかわかりません。perl スクリプトの実行時にアクセス許可がどのように機能するかについて混乱しているか、適切な使用方法について混乱しています-s _。ご指導ありがとうございます。ありがとう!

4

2 に答える 2

11

-s _正しいのではなく単なるタイプミスでない場合は、で開いたディレクトリに関連するファイル名を返す-s $_ことを覚えておいてください。適切な方法は次のようになりますreaddiropendir

my $base_dir = '/path/to/somewhere';
opendir DH, $base_dir or die;
while ($_ = readdir DH) {
  print "size of $_: " . (-s "$base_dir/$_") . "\n";
}
closedir DH;

また、より簡単な方法でファイル名と属性の両方にアクセスする方法を提供するコア モジュールIO::Dirを調べることもできます。tie

于 2012-11-28T09:20:45.763 に答える
0

タイプミスがあります:

$cursize = -s _;

次のようにする必要があります。

$cursize = -s $_;
于 2012-11-28T09:15:29.160 に答える