Цикл Perl for повторяется только один раз при вызове определенного подпрограммы - PullRequest
0 голосов
/ 28 февраля 2011

У меня есть этот кусок кода, который читает выходные данные трассировки для целей мониторинга.

Этот фрагмент кода, приведенный ниже, работает нормально.

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

Как только я вызываю этот sub read_outputfile ($ location [$ 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);
}

Любой ввод?

Ответы [ 2 ]

5 голосов
/ 28 февраля 2011

Всегда, и я имею в виду всегда , запустите ваши сценарии Perl с:

use strict;
use warnings;

Если вы добавите это, вы, скорее всего, сразу же получите сообщения об ошибках по необъявленным переменным.Исправьте их, например:

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

Как только вы объявите все свои переменные (в нужной области видимости), ваша проблема почти наверняка исчезнет.

3 голосов
/ 28 февраля 2011

Похоже, read_outputfile будет продолжать увеличиваться $i до тех пор, пока <$location> не будет исчерпано, и в этот момент оно может быть больше, чем $sizeloc, поэтому ваш внешний цикл завершится.

As @bvrпредполагает, что вы могли бы это исправить, локализовав $i в read_outputfile с

sub read_outputfile{
  my $i;

  etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...