2013-05-16 4 views
0

내 코드에 논리적 인 문제가 있다고 생각합니다. 템플릿, 값, 행, 열이있는 mongodb가 있습니다. 예를 들어, $ record -> {template}은 T1과 $ record -> {column} 1과 $ record -> {row}에 날짜가 있습니다 ("d.m.Y"). $ record -> {row}과 $ record -> {column}에 따라 @insert_data 값을 계산해야합니다. 문제는 @insert_data [1] 또는 @insert_data [2] 또는 ..를 사용할 수 없다는 것입니다. 등 삽입 문에서하지만 왜 이해가 안 돼요, 그리고 어떻게 이해할 수 없어 내 문제를 해결할 수 있습니다.postgresql의 perl 배열 insert 문

while (my $record = $collection->next){ 
    if($record->{template} eq "T1"){ 
     my @insert_data; 
     if($record->{column} == 1 and $record->{row} != 0){ 
      #my @insert_data[1] = $record->{VALUE}; 
     } 
     if($record->{column} == 2 and $record->{row} != 0){ 
      #my @insert_data[2] = $record->{VALUE}; 
     } 
     if($record->{column} == 3 and $record->{row} != 0){ 
      #my @insert_data[3] = $record->{VALUE}; 
     } 
     if($record->{column} == 4 and $record->{row} != 0){ 
      #my @insert_data[4] = $record->{VALUE}; 
     } 
     if($record->{column} == 5 and $record->{row} != 0){ 
      #my @insert_data[5] = $record->{VALUE}; 
     } 
     if($record->{column} == 6 and $record->{row} != 0){ 
      #my @insert_data[6] = $record->{VALUE}; 
     } 
     $stmt->execute(@insert_data[1],@insert_data[2],@insert_data[3],@insert_data[4],@insert_data[5],@insert_data[6],$record->{template}); 
    } elsif($record->{template} eq "T5"){ 

    } elsif($record->{template} eq "T10"){ 

    } 
} 
} 

감사합니다.

답변

2

배열의 연속적인 슬롯을 메서드에 전달하면 꽤 잘못 처리됩니다. 서브에 func($a[1], $a[2], ... $a[n], ...을 전달할 필요는 없습니다. 별도로 전달하면 이 되니 예상보다 일찍 $record->{template}이 나오지 않을 수도 있지만, 슬라이스 표기법은이됩니다. (@a[1..6]). 당신이 슬롯에 할당 할 스칼라시길 ($)가 필요합니다, 그래서

는 그리고 당신은 펄 6을 (당신이하지 않은) 일을하지 않는 한 배열의 슬롯, 스칼라 있습니다.

다음으로 : $insert_data[1].

또한 레거시 COBOL 외부의 모든 곳에서이 코드는 끔찍한 언어입니다. 모든 현대 언어에서 구조에 액세스 할 필요가 없습니다. 당신은

my $col = $record->{column}; # cache frequently referenced item. 
if ($record->{row} != 0 and $col > 0 and $col < 7) { 
    $insert_data[ $col ] = $record->{VALUE}; 
} 

을 할 수 그리고 당신은 정의되지 않은 값으로 하나의 쿼리에 하나의 실제 값을 전달하려는 왜 나를 넘어하지만 다음과 같습니다해야합니다

$stmt->execute(@insert_data[1..6], $record->{template}); 

슬라이스 표기법 (@a[$i..$j])은 6 개의 위치 값을 인수로 전송한다는 것을 명심하십시오. 이것은 구현과 구현에서 $record->{column}이 1 인 경우 배열이 단순히 [ undef, $record->{VALUE} ]이므로 중요 할 수 있습니다. 그것은 offset # 0과 offset # 1에 2 개의 요소를 가지고 있습니다.

슬라이스 표기법이 없으면 두 개의 인수를 $record->{template} - 아마도 예상하지 못한 것보다 먼저 전달합니다. 그러나 슬라이스 표기법을 사용하면 배열의 슬롯 수가 실제로 할당되고 할당되는 방식을 보장하므로 결과 식은 6 자리를 차지합니다 (5는 undef).맨 먼저, USUW, 자신과 같은 초보자를위한 그러나

:

코드의 상단에 갈 필요
use strict; 
use warnings; 

. 엄격한 스크립트를 죽이는 오류를 이해할 수 없다면 perlfaq에서 쉽게 찾을 수 있고 해결책도 쉽게 찾을 수 있습니다. 당신이 원하는 것보다 경향이 있습니다

use diagnostics -verbose; 

가 당신에게 더 많은 설명을 제공하기 : 당신이 warnings가 제공하는 메시지를 이해하지 않는 경우

는, 당신은 또한 당신의 코드의 상단에이 라이브러리를 삽입 할 수 있습니다 독서.

+0

답변 해 주셔서 감사합니다. 나는 틀린 것과 다른 설명을 이해합니다. 당신이 나를 도울 수 있다면 한가지 더 질문이 있습니다 ... 모든 데이터가 중재되어 있음을 언급하는 것을 잊었습니다. 모든 데이터를 같은 행에 삽입해야합니다. 예 : $ record -> {row} = 1 and $ record -> {column} [1..6] = 내 postgresql 데이터베이스의 레코드 하나. 이제 postgresql에서 6 개의 레코드가 있습니다. – Crsr

0

나는 당신이 우리에게 오류 메시지를 제공하지 않는 발견,하지만 난이 정보가 유용 할 수 있습니다 가정합니다 :

@array_name[integer]는 단일 요소 배열 슬라이스입니다. $array_name[integer]은 배열 내에서 스칼라 값입니다.

배열 대신 execute 문에 값을 전달하는 것이 좋습니다.

1

$stmt->execute 뒤에 수표를 추가하는 것이 좋습니다.

$stmt->execute(@insert_data[1..6], $record->{template}) or die $stmt->errstr; 

use strict;도 도움이 될 수 있습니다.