2010-08-31 78 views
-1

我对perl完全陌生,刚刚学习它。我遇到了我需要运行的脚本,它具有一些网络Tstat跟踪数据。但是,我收到错误“无法解析日期”。简单的perl opendir

产生这种情况的代码是在这里

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; 
} 

一些能告诉我这是什么代码正在寻找?

+0

传递给ParseDate()的参数是什么?这是一个简单的调试问题,您需要分析您的输入以验证它们是您所期望的。 – Ether 2010-08-31 16:18:30

回答

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的价值,这显然是像“扬”的字符串, 'Feb'等等,不是ParseDate所喜欢的。

请注意,只应在成功的模式匹配后使用捕获变量,以免它们从不同的匹配中遗留下来。

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); 

他们到达它调用ParseDate功能循环之前筛选出错位的.out文件(HM,实际上是目录)。