2013-03-22 2 views
0

필자에게는 재귀 함수를 실행하는 Perl-Script가 있습니다. 그 안에는 2 차원 배열의 두 요소가 비교됩니다.펄 생성 할 수없는 배열 값의 수정 시도, 첨자 -1

"@data"및 "0"을 시작 값으로 사용하여 루틴을 호출합니다. 먼저 매개 변수를 별도의 2D 배열 "@test"에로드합니다.

그런 다음 배열에 마지막 요소가 하나 인 경우> 요소 만 비교하면>보고 싶습니다. 그리고 이것은 오류가 발생하는 곳입니다. 생성 할 수없는 배열 값의 수정 시도, 첨자 -1.

배열 값을 봄으로 만들려고했는데, 첨자는 아마도 음수 였고, 배열의 끝에서부터 세어 보았을 수도 있습니다.

이것은 많은 도움이되지 못했습니다 ... if-clause "$ counter-1"과 관련이 있습니다. 그러나 나는 당신이 나를 도울 수 있기를 바랍니다.

routine(@data,0); 

sub routine { 
    my @test #(2d-Array) 

    my $counter = $_[-1] 

    for(my $c=0; $_[$c] ne $_[-1]; $c++){ 

     for (my $j=0; $j<13;$j++){ #Each element has 13 other elements 

      $test[$c][$j] = $_[$c][$j]; 

     } 
    } 
    if ($test[$counter-1][1] eq $test[-1][1]{ 

     $puffertime = $test[$counter][4]; 

    } 
    else{ 
     for (my $l=0; $l<=$counter;$l++){ 

      $puffertime+= $test[$l][4] 

     } 
    }  
} 
# 
# 
# 

if ($puffertime <90){ 

    if($test[$counter][8]==0){ 

     $counter++; 
     routine(@test,$counter); 
    } 


    else{ return (print"false");} 

} 
else{return (print "true");} 

오늘 아침에 시도해 본 것은 이상한 일입니다. 그가 짧은 시간 동안 뛰었을 때 다시이 오류 메시지가 나타났습니다. 동적 데이터베이스 항목에 의해 발생할 수있는 오류 배열을 따라 잡지 못했을 수도 있습니다.

+0

당신이 저장하는 배열의 마지막 요소를 사용하고 요소의 수? 'my $ counter = $ _ [- 1]'은 무엇입니까? – Arkadiy

+0

@Arkadiy, 그는 루틴의 '두 번째'주장으로 카운터를 지나가고 있습니다. –

+0

배열에 요소가 하나만 있는지 확인하기 위해 고유 ID가 포함 된 [-1] [1]을 사용하여 test의 마지막 요소를 사용하고 다음 코드에서 중요한 $ puffertime에 값을 전달하십시오. – phips0r

답변

0

귀하의 routine() 함수는 다음과 같이 시작합니다 경우 읽기 쉬울 것 :

sub routine { 
    my @data = @_; 
    my $counter = pop(@data); 
    my @test; 

    for(my $c=0; $c <= $#data; $c++){ 
    for (my $j=0; $j<13;$j++){ #Each element has 13 other elements 
     $test[$c][$j] = $data[$c][$j]; 
    } 
    } 

당신은 @data 만 scalar(@data) == 1 또는 $#data == 0을 수행하여 하나 개의 요소가 있는지 확인할 수 있습니다. 코드 스 니펫에서 routine()에서 @test으로 전달할 데이터를 복사해야하는 이유가 표시되지 않습니다. 불필요한 것 같습니다. 루틴에 전달 된 데이터를 수정하지 않으려는 경우이 복사를 모두 건너 뛸 수 있습니다.

if ($#test == 0) { 
    $puffertime = $test[0][4]; 
} else { 
    for (my $l=0; $l <= $counter; $l++) { 
    $puffertime += $test[$l][4]; 
    } 
} 

을하지만 글로벌 변수 $puffertime가 0으로 초기화 된 경우 당신은이 코드를 대체 할 수있다 : 당신의 다음 코드는 다음과 같을 수

for (my $l=0; $l <= $counter; $l++) { 
    $puffertime += $test[$l][4]; 
}