Как искать строку и идти спать?

foreach (@raw_data) {

  if ($raw_data[$count] =~ /Date/) {

    @dur            = split(/:/, $raw_data[$count]);
    $durtime        = "$dur[1]" . ":" . "$dur[2]" . ":$dur[3]";
    @dur            = split(/,/, $durtime);
    $startlocaltime = $dur[1];
    $starttime      = str2time($dur[1]);

    # $starttime=10000;
    $count++;
    $status = "PASS";
    if ($raw_data[$count] =~ /Command/) {

      @cmdsyntax = split(/:/, $raw_data[$count]);
      $cmdcount++;

      #Splitting Command name
      @cmdname = split(/\(/, $cmdsyntax[1]);
      $cmdlog = $cmdsyntax[1] . "\n";
      $count += 2;

      #Parsing for command output
      while ($raw_data[$count] =~ /[COMPLETED]/) {

        #Checking status of commmand
        if ($raw_data[$count] =~ /Error/i) {
          $status = "FAIL";
        }
        if ($raw_data[$count] =~ s/\"/\'/g) {
          $raw_data[$count] = $raw_data[$count];
        }
        if ($raw_data[$count] =~ s/&/ /g) {
          $raw_data[$count] = $raw_data[$count];
        }

        #Forming comandlog
        $cmdlog .= $raw_data[$count] . "\n";
        $count++;
      }

      #Changes Added
      my $xyz = "false";
      if ($raw_data[$count] =~ /^GetFTSJOBStatusResult/) {
        my $xyz = "true";
        next;
      }

      if ($xyz =~ /true/) {
        if ($line =~ /.*,([A-Za-z]*),.*/) {
          $status = $1;
          if ($status = ~/ACTIVE/) {
            sleep(1000);
            system("/bin/sh /tmp/uday/cliTestExecution1.sh  135.250.70.161 alcatel Linux1.* 11.54");
            goto START;
          }
        }
      }

      #Changes ends

      $cmdlog .= $raw_data[$count] . "\n";
      $count++;
    }

У меня есть два тестовых примера в файле журнала ActivateJob и GetJOBStatus, как показано ниже.

Мой сценарий Perl в настоящее время устанавливает PASS по умолчанию и ищет Error в приведенных ниже тестовых примерах.

Если он находит ошибку, он помечает тестовый пример как FAIL.

Для GetJOBStatus тестового примера, если он ACTIVE, скрипт должен заснуть на пару минут, и он должен снова выполнить GetJOBStatus, и если это успешный тестовый пример, он должен быть пройден, иначе он не пройден.

Я попытался добавить сон на несколько секунд и снова вызвать скрипт, но это не работает.

Пожалуйста, помогите мне найти правильную логику.

файл журнала

Date and Time is:Thu, 20-06-2013 06:04:19
Line 4 Command:ActivateJob(Job=Test_Abort_New1);
Answer:
ActivateFTSJobResult = Success
COMPLETED

Date and Time is:Thu, 20-06-2013 06:04:19
Line 5 Command:GetJOBStatus(Job=Test_Abort_New1);
Answer:
GetJOBStatusResult = NELabel,Status,ErrorReason,Progress,CurrentUnit,Total
TSS_320_1,ACTIVE,No Error,0,BACKUP.DSC,0
COMPLETED

person user1954970    schedule 27.06.2013    source источник
comment
Перейти к? Серьезно? Пожалуйста, используйте какие-нибудь подпрограммы или классы или что-нибудь кроме этого.   -  person m0skit0    schedule 27.06.2013
comment
Я рекомендую сначала инвестировать в пробел.   -  person friedo    schedule 27.06.2013
comment
Я попытался привести ваш Perl-код в порядок, чтобы он стал более читабельным, но он остается ужасным примером языка. Я уверен, что у вас нет use strict и use warnings на месте. Будет вежливо изложить свой вопрос как можно лучше, и я вижу, что вы провели здесь мало времени. Я не удивлен, что вы не видите, как заставить ваш код работать с таким макетом: я тоже не мог.   -  person Borodin    schedule 27.06.2013


Ответы (1)


if ($status = ~/ACTIVE/)

Это не проверка регулярных выражений, пробел не в том месте. Без strict или предупреждений он, скорее всего, будет рассматривать «~/ACTIVE/» как строку с голым словом, а затем назначит ее $status.

person Oesor    schedule 27.06.2013
comment
Нет, это не будет пустым словом. Вместо этого регулярное выражение /ACTIVE/ будет соответствовать переменной $_, а ~ будет побитовым отрицанием. Результатом этого регулярного выражения является логическое значение 1/0, поэтому значение $status будет равно MAXINT или MAXINT-1. Тем не менее, +1 за указание на эту серьезную ошибку! - person amon; 27.06.2013
comment
@amon: Почему вы говорите, что результат этого регулярного выражения — логическое значение 1/0? Это просто false, потому что $_ не определено и оценивается как пустая строка. Оператор ~ интерпретирует его как ноль и возвращает 0xFFFFFFFF. - person Borodin; 27.06.2013
comment
@Borodin 1. $_, вероятно, не является неопределенным; мы находимся в цикле foreach без явной переменной цикла. 2. Насколько я понимаю, результатом регулярного выражения в скалярном контексте является 1 в случае успеха и значение Perl false (IV=0, NV=0, PV=) в противном случае. Двоичное отрицание предпочитает интерпретацию скаляра IV, что в любом случае дает очень большое число, что всегда верно. Таким образом, if(...) всегда верно - person amon; 27.06.2013
comment
@amon: А, понятно. Вы имеете в виду Результатом этого регулярного выражения является логическое значение 1 или 0. В нынешнем виде это читается как результат деления 1/0, которое, как вы, по-видимому, тоже ошибочно, оценили как MAXINT. - person Borodin; 27.06.2013