0

フォルダーの下に作成された最新のログ ファイルを最初に識別し、それを開いて特定のデータを探すスクリプトを作成しようとしています。基本的に、このログ ファイルで特定のエラーを探し、エラーを新しいログ ファイルに出力します。

最新のファイルを取得するために並べ替えを実行する方法は理解していますが、最新のファイルを読み取って新しいログ ファイルにコピーするのに問題があります。

use File::stat;

$dirname  = 'C:/Luntbuild_Logs';
$timediff = 0;

opendir DIR, "$dirname";

while ( defined( $file = readdir(DIR) ) ) {
    if ( $file ne "." && $file ne ".." ) {
        $diff = time() - stat("$dirname/$file")->mtime;
        if ( $timediff == 0 ) {
            $timediff = $diff;
            $newest   = $file;
        }
        if ( $diff < $timediff ) {
            $timediff = $diff;
            $newest   = $file;
        }
    }
}

print $newest;

$file1 = "$dirname/$file";

open( FILE1, "<$newest" );
my (@fprint) = <FILE1>;
close FILE1;

open( FOUT, ">list1.txt" ) || die("Cannot Open File");

foreach $line (@fprint) {
    print "$line" if $line =~ /> @/;
    print "$line" if $line =~ /ORA-/;
    print FOUT $line;
}

close FOUT;
4

2 に答える 2

2

あなたのエラーはここにあるようです:

open(FILE1,"<$newest");

パスを含めずに (ファイル名のみを返す) ファイルを開こうとするとreaddir、現在の作業ディレクトリが何であるかに応じて、機能する場合と機能しない場合があります。

ステートメントの戻り値をチェックしないためopen、失敗したかどうかはわかりません。ほとんどの場合、次のようなことを行う必要があります。

open FILE1, "<", "$dirname/$newest" or die $!;

openすべての、および呼び出しの戻り値を常に確認してくださいopendir。これらはサイレントに失敗する可能性があるためです。また、必ず以下を含めてください。

use strict;
use warnings;

スクリプトで、エラーと警告を修正します。これは、検出が困難なバグに対する最も安全な予防策です。

于 2012-08-22T13:32:26.733 に答える
2

主な問題は、完全なファイル パスを作成してから、ファイル名のみを含むファイル$file1を開くことです。$newest

あなたは本当にあなたのコードを改善する必要があります

  • プログラムの開始時に常にuse strictandを使用し、定義の時点でuse warningsすべての変数を で宣言するmy

  • レキシカル ファイルおよびディレクトリ ハンドルと、open の 3 つのパラメーター形式を使用します。オープンのステータスを常にテスト$!し、die文字列を入力して、失敗した理由を確認します

  • 変数が何をするのかを理解していない限り、変数を二重引用符で囲まないでください。

これらのガイドラインに従い-M、ファイルの経過日数を返す組み込み演算子も使用するコードのリファクタリングを次に示します。

use strict;
use warnings;

my $dirname = 'C:/Luntbuild_Logs';
my ($newest_age, $newest_file);

opendir my $dh, $dirname or die $!;

while ( readdir($dh) ) {
  my $file = "$dirname/$_";
  next unless -f $file;
  my $age = -M $file;
  unless (defined $newest_age and $newest_age <= $age) {
    $newest_age = $age;
    $newest_file = $file;
  }
}

print $newest_file, "\n";

open my $out,'>', 'list1.txt' or die "Cannot open file: $!";

open my $in, '<', $newest_file or die $!;
while (<$in>) {
  print if /> \@/ or /ORA-/;
  print { $out } $_;
}

close $out or die $!;
close $in or die $!;
于 2012-08-22T14:07:09.963 に答える