2010-08-31 77 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,實際上是目錄)。