2013-05-16 79 views
0

我想我的代碼中存在邏輯問題。我有一個模板,值,行,列的mongodb。例如$ record - > {template}它是T1和$ record - > {column} 1和$ record - > {row}我有一些日期(「d.m.Y」)。我需要arrage @insert_data值取決於$ record - > {row}和$ record - > {column}postgresql插入語句中的perl數組

問題是我無法使用@insert_data [1]或@insert_data [2]或..等插入語句,但我不明白爲什麼,我不明白我該如何解決我的問題。

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])。

除非你正在做的Perl 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} ];它只有2個元素,在偏移#0和偏移#1。

沒有切片符號,您在$record->{template}之前通過兩個參數 - 可能意外。但切片表示法確保瞭如何有史以來陣列的許多時隙被實際分配和分配,所得表達會佔用6個位置(其中5將undef)。

但首先,對於這樣一個新手的自己,USUW:

use strict; 
use warnings; 

需要去你的代碼的頂部。如果您不明白嚴格殺死腳本的錯誤,您可以輕鬆地在perlfaq中查找,並使用Google搜索解決方案也很容易。

use diagnostics -verbose; 

其它會比你想給你更多的解釋:

如果你不明白,warnings是給一個消息,那麼你也可以在你的代碼的頂部插入這個庫讀。

+0

感謝您的回答。我明白什麼是錯誤的和其他解釋。如果你能幫助我,我還有一個問題......我忘記提及所有數據都是相互關聯的。我需要將所有數據插入同一行。例如:$ record - > {row} = 1和$ 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;也可以是有幫助的。