2011-02-28 28 views
0

我有這段代碼來讀取traceroute的輸出以進行監視。Perl for循環僅在調用特定的子集時迭代一次

下面的這段代碼工作正常。

for ($i = 0; $i < $sizeloc; $i++) { 
    for ($j = 0; $j < 1; $j++) { 
    if ($j==0) { 
     system("tracert " . $locations[$i][$j] . " > d:\\netmon\\" 
       . $locations[$i]  [$j+1]); 
    } 
    } 
} 

只要我叫這個子read_outputfile($ locations [$ i] [$ j + 1]);在循環內發生問題。它只是迭代一個對象,然後我的程序結束。所以第一次調用read_outputfile時,它會運行子代碼。只有它不會返回到循環。它只是完成。

for ($i = 0; $i < $sizeloc; $i++) { 
    for ($j = 0; $j < 1; $j++) { 
    if ($j==0) { 
     system("tracert " . $locations[$i][$j] . " > d:\\netmon\\" . 
      $locations[$i][$j+1]); 
     read_outputfile($locations[$i][$j+1]); 
    } 
    } 
} 

sub read_outputfile{ 
    my($location) = @_; 

    open ($location, "$location"); 
    while ($record = <$location>) { 
    $i++; 
    if ($i == 8) { 
     $out = substr($record , 32); 
     if($out != "88.15.160.255") {    
     mail($location);    
     } 
    } 
    } 
    close($location); 
} 

任何輸入?

+0

'read_outputfile'的定義是什麼? – bvr 2011-02-28 13:33:53

+3

'$ out!=「88.15.160.255」'可能沒有達到您的預期 - '!='是一個數字比較運算符;使用'ne'進行字符串比較。 – mob 2011-02-28 13:39:58

+2

'嚴格使用;使用警告;'會發現這個錯誤。始終嚴格執行併發出警告。 – friedo 2011-02-28 13:58:38

回答

3

它看起來像read_outputfile將繼續增加$i,直到<$location>耗盡,此時它可能會大於$sizeloc,因此您的外循環將終止。

由於@bvr建議,你可以通過在read_outputfile

sub read_outputfile{ 
    my $i; 

    etc... 
+0

也許,我是perl的新手,所以我需要找到一種調試方法。 – Datapimp23 2011-02-28 13:39:30

+0

你的編輯速度更快,我只是寫了同樣的答案。 – bvr 2011-02-28 13:48:11

+1

@ Datapimp23 - 有關調試教程,請參見[perldebtut](http://perldoc.perl.org/perldebtut.html)。它還包含其他有用的疑難解答。 – bvr 2011-02-28 13:50:18

5

始終本地化$i解決這個問題,我的意思是總是,與啓動Perl腳本:

use strict; 
use warnings; 

如果您添加這個,你很可能會立即得到關於未聲明變量的錯誤消息。解決這些,例如:

for (my $i = 0; $i < $sizeloc; $i++) { 
    for (my $j = 0; $j < 1; $j++) { 
     ... 
    } 
} 

一旦你聲明的所有變量(在正確的範圍內),您的問題幾乎肯定會消失。