2013-08-21 58 views
0

我有一個非常大的日誌文件,它會定期更新。這是因爲如下:Perl根據條件解析文件

commands: (List of files to be copied) 
Exit time: Fri May 10 05:33:00 2013 
Exit status: 2 

commands: (List of files to be copied) 
Exit Time: Fri May 20 05:34:00 2013 
Exit status: 2 

commands: (List of files to be copied) 
Exit Time: Fri May 30 05:50:00 2013 
Exit Status: 1 

我有以下根據退出狀態,其產生的哈希碼

while ($line = <FH>) { 
     if ($line =~ /Exit time/) { 
     ($exittime, $exittimeval) = split(': ',$line); 
     $stat{$qbsid} = { 
      time  => $exittimeval 
      }; 
} 

我現在需要基於本地時間使得腳本不比較日誌創建時間戳文件的時間戳後(本地時間)。我的代碼進行比較的時候如下

$date1 = "$hr1:$min1:$sec1, $moy1/$dt1/$yr1"; 
$date2 = "$hr2:$min2:$sec2, $moy2/$dt2/$yr2"; 
sub to_comparable { 
    my ($date) = @_; 
    my ($H,$M,$S,$d,$m,$Y) = $date =~ m{^(\d+):(\d+):(\d+), (\d+)/(\d+)/(\d+)\z} 
     or die; 
    return "$Y$m$d$H$M$S"; 
} 

if (to_comparable($date2) > to_comparable($date1)) { 
print "right\n"; 
} else { 
     print "wrong \n"; 
} 

這裏$ HR1,$ MIN1,$秒-1,$ moy1,$ DT1及$ YR1均爲當地時間變量而HR2,$ MIN2,$秒2,$ moy2,$ dt2和$ yr2是從散列獲得的值。

最好在首次運行時比較整個文件並創建一個時間戳。之後,上述想法開始。

如果有任何問題,請糾正我。謝謝。

回答

2

您可能要考慮使用Time::Piece,它首次在perl v5.9.5中發佈。

#!/usr/bin/perl 
use strict; 
use warnings; 
use Time::Piece; 

{ 
    my $end_date = '2013-05-30'; 

    local $/ = ''; 
    while (<DATA>) { 
     if (/^Exit Time: (.+)/m) { 
      my $date = Time::Piece->strptime($1, "%c"); 
      print $date->ymd, "\n" if $date->ymd lt $end_date; 
     } 
    } 
} 

__DATA__ 
commands: (List of files to be copied) 
Exit Time: Fri May 10 05:33:00 2013 
Exit status: 2 

commands: (List of files to be copied) 
Exit Time: Fri May 20 05:34:00 2013 
Exit status: 2 

commands: (List of files to be copied) 
Exit Time: Fri May 30 05:50:00 2013 
Exit Status: 1 

輸出:

2013-05-10 
2013-05-20 
+0

任何替代時間::件module..If我可以像年,月,日,小時,分鐘,秒等正常比較..只是一個建議..謝謝 – deep

+0

@deep它可用於Perl 10或更新版本。你爲什麼不想用它?是的,如果需要,你可以手工編寫代碼。 –

0

您將形成一個20位數的數字(假設年份是4位數,其餘的總是2位數字)。這是一個很大的數字,但在我的64位UNIX操作系統上似乎很好;我不知道你的。無論如何,使用固定長度的字符串,如果數字很大是個問題,則可以進行字符串比較(「ge」而不是「>」)。

如果任何輸入(例如$ moy1)可能是單個數字,那麼從10月1日(2013101)開始到9月30日(2013930)之前,您的比較函數將不起作用。你可能需要的位數固定數量的使用:

my ($H,$M,$S,$d,$m,$Y) = $date =~ m{^(\d\d):(\d\d):(\d\d), (\d\d)/(\d\d)/(\d\d\d\d)\z} 
     or die; 

我敢肯定$ qbsid是如何設置的(退出狀態或別的東西),但由於你的代碼沒有完成我假設你有別的東西去做。

我也不確定您的原始時間字符串(例如「Fri May 30 05:50:00 2013」​​)轉換爲「$ hr1:$ min1:$ sec1,$ moy1/$ dt1/$ yr1「格式,但我假設你在其他地方也這樣做。

+0

@kjpres它是16位number..So,它好工作爲system..Thanks – deep