Как да потърся низ и да заспя?

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/)

Не е проверка на регулярен израз, интервалът е на грешното място. Без стриктни или предупреждения, вероятно ще третира '~/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 (IV=0, NV=0, PV=) в противен случай, доколкото мога да видя. Двоичното отрицание предпочита IV интерпретацията на скалара, което води до Много голямо число и в двата случая, което винаги е вярно. Следователно if(...) винаги е вярно - person amon; 27.06.2013
comment
@amon: А, разбирам. Имате предвид Резултатът от този регулярен израз е булево 1 или 0. В сегашния си вид той се чете като резултат от разделянето 1/0, което изглежда - също погрешно - казвате, че е оценено като MAXINT. - person Borodin; 27.06.2013