-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

当您遇到此类问题时,请查看您尝试使用的数据,让自己大吃一惊。确保 in 的值$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 回答