-1

私はperlにまったく慣れておらず、ちょうどそれを学んでいます。いくつかのネットワーク Tstat トレース データを含む、実行する必要があるこのスクリプトを見つけました。しかし、「日付を解析できません」というエラーが表示されます。

これを生成するコードはこちら

foreach my $dir (@trace_dirs) {
 undef @traces;
 opendir(DIR, $dir) || die "Can't open dir: $dir \n";
 @traces = grep { /.out$/ && -d "$dir/$_" } readdir(DIR);
 foreach my $trace (@traces) {
  $trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/;
  $trace_date=&ParseDate("$3/$4/$5 $1:$2") || die "Cannot parse date \n";
  $traces{$trace_date} = $trace;
  $trace_dir{$trace_date} = $dir;
 }
 closedir DIR;
}

このコードが何を探しているか教えてもらえますか?

4

2 に答える 2

2

このような問題に遭遇したときは、操作しようとしているデータを見て骨を折ってください。$traceの値が期待どおりであること、および作成する日付文字列が期待どおりであることを確認してください。

 print "Trace is [$trace]\n";
 if( $trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/ ) {
     my $date = "$3/$4/$5 $1:$2";
     print "date is [$date]\n";
     $trace_date= ParseDate( $date ) || die "Cannot parse date [$date]\n";
     }

$4どうやら「Jan」、「Feb」などの文字列であるの値は、好きなものではないと推測していますParseDate

キャプチャ変数は、パターン マッチが成功した後にのみ使用する必要があることに注意してください。別のマッチでキャプチャ変数が残らないようにしてください。

于 2010-08-31T10:45:41.490 に答える
1

しかし、「日付を解析できません」というエラーが表示されます。

次の行が原因でエラーが発生します。

$trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/;

スクリプトは、拡張子.outを持つディレクトリ内のすべてのファイルの名前の先頭に適切なタイムスタンプがあることを想定しています。また、スクリプトの行にはエラー処理がありません。

ここにチェックを追加してみてください。

unless($trace =~ /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/) {
   warn "WRN: Malformed file name: $trace\n";
   next;
}

ファイル名が一致するかどうかを確認し、一致しない場合は警告が出力され、スキップされます。

または、チェックをgrep {} readdir()行に追加することもできます。

@traces = grep { /.out$/ && /^(\d\d)_(\d\d)_(\d\d)_(\w\w\w)_(\d\d\d\d)/ && -d "$dir/$_" } readdir(DIR);

.out関数を呼び出すループに到達する前に、誤って配置されたファイル (実際にはディレクトリ)を除外しParseDateます。

于 2010-08-31T11:34:10.790 に答える