Perl for循环在调用特定sub时只迭代一次

时间:2011-02-28 13:31:20

标签: perl loops

我有这段代码可以读取traceroute的输出以进行监控。

以下这段代码可以正常使用。

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时它会运行sub中的代码。只是,它不会返回循环。它结束了。

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

任何输入?

2 个答案:

答案 0 :(得分:5)

始终,我的意思是始终,使用以下命令启动Perl脚本:

use strict;
use warnings;

如果添加此项,您很可能会立即收到有关未声明变量的错误消息。修复这些,例如:

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

一旦你宣布了所有变量(在合适的范围内),你的问题几乎肯定会消失。

答案 1 :(得分:3)

看起来read_outputfile将继续增加$i,直到<$location>耗尽,此时它可能会大于$sizeloc,因此您的外部循环将终止。< / p>

正如@bvr建议的那样,您可以通过$i中的read_outputfile本地化

来解决此问题
sub read_outputfile{
  my $i;

  etc...