2011-04-20 190 views
1

我有以下代碼,唯一的問題是,當代碼到達嵌套while循環時,它跳過它,我假設條件沒有被滿足,但任何人都可以看到我的東西做錯了?我已經證實,我給腳本的所有標誌都是正確的,並且job_name是我認爲應該是的。嵌套while循環不執行

open $alOut, 
    "/home/usr/bin/test.pl -j EW-% -j RA-% -l 0 | grep `date \"+%m/%d/%Y\"` | sort -k 3,3|"; 
while (<$alOut>) { 
    chomp; 
    my ($job_name, $date, $start_time, $end_time, $duration, 
     $state, $return, $expected_end_time) = split(/\s+/, $_); 

    # Go to next iteration if jobname is EW-INTERNAL-AUTOSYS, 
    # EW-INTERNAL-DB-LONGQUERY-ALERT, EW-INTERNAL-DB-LONGQUERY-ALERT, 
    # EW-CIIM-ADJ-TRIGGER, or EW-S140-ADJ-TRIGGER 
    if (($job_name eq "EW-INTERNAL-AUTOSYS") || 
     ($job_name eq "EW-INTERNAL-DB-LONGQUERY-ALERT") || 
     ($job_name eq "EW-INTERNAL-SYSUP") || 
     ($job_name eq "EW-CIIM-ADJ-TRIGGER") || 
     ($job_name eq "EW-S140-ADJ-TRIGGER")) 
     { 
      next; 
     } 

    #Expected Start Time 
    open $alOut2, 
     "/home/usr/bin/test.pl -j $job_name -q -l 0 | grep -E `condition:|start_times:`"; 
    while (<$alOut2>) { .... } 
} 
+1

您應該測試打開時是否有錯誤。 – Toto 2011-04-20 17:59:47

+2

你可能想在這裏使用'while(defined(my $ line1 = <$alOut>))'和'while(defined(my $ line2 = <$alOut2>))',否則你會用'$ _'來處理兩個不同的事情相同的範圍,並可能遲早會引起混淆。 – 2011-04-20 18:11:18

+2

您的代碼中的第一條評論是「如何不評論代碼」的經典示例。 – Svante 2011-04-20 20:46:18

回答

5

您應該open檢查錯誤:

open $fh, ... or die "Can't open: $!"; 

而在這的grep:

grep `condition:|start_times:` 

你可能要經常單引號('),而不是反引號,殼將嘗試運行一個名爲condition:的命令。而且我認爲你在該命令中缺少最後的|

3

,您應經常檢查由open返回值:

open "...whatever..." or die "Can't open: $!"; 

這可能會告訴你所有你需要知道,但隨便,我可以看到兩個問題:

  1. 第二個開放不會被|字符終止。
  2. grep之後的反引號應該是撇號。