0

I have made a script to extract the content of log files and to calculate the time difference if the task is complete.

Suppose I have four jobs and each job has thre individual tasks, so far I need the start of each task, and just print it.

Everything is fine except when I try to initialise to make it convenient, by using $j, $l which are used as sort of two-dimensional array.

The problem is at the output where I get the same "Started at" for each job.

The values of $counter and $l should be the root cause.

Can anyone help? I tried my best and am sort of newbie.

sub getdate {
    my $line = $_[0];

    ($hrs, $min) = split(':', $line, 3);
    return $hrs, $min;
}

print FILE "<html><head>\n";
print FILE "<title>CGI Test</title>\n";
print FILE "</head>\n";
print FILE "<body>";
print FILE "<font size=\"5\" color=\"#008080\" face=\"Tahoma\"><b><u><br>";
print FILE "PBI Batch for 22/02/2013";
print FILE "</font></b></u><br><br><br>";

my $i = 0;
my $j = 0;
my $l = 0;

my @sample;

#print FILE "<h4>";

foreach $header (<COLLECTION>) {
    chomp($header);
    ($heading, $filepath) = split(',', $header);

    #$two[$i]="<font size=\"3\"color=\"#008000\" face=\"Tahoma\"><b><u><br>";
    #$two[$i]="<font size=\"3\" color=".$color." face=\"Tahoma\"><b><u><br>";
    $two[$i] .= $heading;

    #$two[$i] .= "</font></u></b><br>";
    #print FILE "<font size=\"3\" color=\"#008000\" face=\"Tahoma\"><b><u><br>";
    #       print FILE $two[$i];
    #print FILE $heading;
    #print FILE "</font></u></b><br>";

    #print $filepath."\n";
    open(MYFILE1, $filepath) or die 'Could nont openfile';

    my $counter;
    foreach $list (<MYFILE1>) {

        chomp($list);
        ($file, $path) = split(',', $list);

        #print FILE $file;
        my @secondstart;
        my @secondend;
        my $secondcounter = 0;

        #print FILE "valueofllllllllllllllllllllllllllll".$l;
        foreach $counter ($file) {
            print FILE "valueofllllllllllllllllllllllllllll" . $l;
            $l++;
            $sample[$j][$l] = $counter;
            print FILE "secCOUNTER  " . $secondcounter;
            $secondcounter++;
        }

        print FILE "                                space";

        open(MYFILE, $path) or die 'ERRROR';
        my $count = 0;
        foreach $line (<MYFILE>) {

            my @endtime;

            $flag = 'false';

            #$counter++;
            $count++;
            print FILE $count . "========";

            if ($count == 1) {
                ($hrs, $min) = getdate($line);
                $starttime[$j][$l] = ($hrs * 60) + $min;
            }
            else {
                ($hrs, $min) = split(':', $line, 3);
                if ($line =~ m/End of Procedure/) {
                    $flag            = 'true';
                    $endtime[$j][$l] = $hrs . $min;
                    $endtime[$j][$l] = ($hrs * 60) + $min;
                }
                else {
                    $endtime[$j][$l] = ($hrs * 60) + $min;
                }
            }

            $duration[$j][$l] = $endtime[$j][$l] - $starttime[$j][$l];

        }

        #   print $flag;

        #print FILE $file." : ";
        #print FILE "value of ".$j."and".$l;
        $startstatus[$j][$l]    = "Started at" . $starttime[$j][$l];
        $durationstatus[$j][$l] = "&nbspDuration is " . $duration[$j][$l] . "m";

        # print FILE "Started at".$starttime;
        # print FILE "&nbspDuration is ".$duration."m";

        #                 print FILE "<br>";

        close(MYFILE);

    }

    my $valueofl = $l;

    #print FILE "vlaeeofl".$valueofl;
    print "valueofllllllllllllllllllllllllllll" . $l;
    $l = 0;

    if ($flag eq 'true') {
        $status = 'Completed';
        $color  = '#008000';

        print FILE "<font size=\"3\" color=" 
            . $color
            . " face=\"Tahoma\"><b><u><br>"
            . $two[$i]
            . "</font></u></b><br>";
        print FILE $status . "<br>";

        while ($l <= $valueofl) {

            #print $j."and".$l;
            #   print "valueofllllllllllllllllllllllllllll".$l;

            print FILE $sample[$j][$l] . "&nbsp&nbsp&nbsp&nbsp";
            print FILE $startstatus[$j][$l] . "&nbsp&nbsp&nbsp&nbsp";
            print FILE $durationstatus[$j][$l] . "<br>";
            $l++;
        }

        # print FILE $startstatus[$j][0];
        # print FILE $durationstatus[$j][0];
    }
    else {
        #print "valueofllllllllllllllllllllllllllll".$l;
        #print $j."and".$l;
        $status = 'In Progress';
        $color  = 'blue';
        print FILE "<font size=\"3\" color=" 
            . $color
            . " face=\"Tahoma\"><b><u><br>"
            . $two[$i]
            . "</font></u></b><br>"
            . $status;
    }
    $i++;
    $j++;

}

print FILE "</body>";
print FILE "</html>";

close(FILE);
close(MYFILE1)
4

1 に答える 1

4

これはPerlの衝撃的な部分です。プログラムは常にuse strictuse warningsで開始し、すべての変数を。を使用して最初の使用ポイントにできるだけ近い場所で宣言する必要がありますmy。これはデバッグの最も基本的な形式であり、少なくとも他の人に助けを求める前にこれを行うのは礼儀正しいだけです。

問題はあなたのfor声明にある可能性が高い

foreach $counter ($file) { ... }

これは、の値に設定された状態で、ループの本体を1回だけ実行します。あなたがそれを何を意味したのか想像できません。$content$file

于 2013-03-17T13:13:28.470 に答える