Arrays postgresql insert语句中的perl数组

Arrays postgresql insert语句中的perl数组,arrays,perl,postgresql,mongodb,if-statement,Arrays,Perl,Postgresql,Mongodb,If Statement,我想我的代码中有一个逻辑问题。我有一个带有模板、值、行、列的mongodb。例如$record->{template}它是T1和$record->{column}1和$record->{row}我有一些日期(“d.m.Y”)。我需要根据$record->{row}和$record->{column}排列@insert_数据值 问题是我不能在insert语句中使用@insert_data[1]或@insert_data[2]或..等,但我不明白为什么,也不明白如何解决我的问题 while (my

我想我的代码中有一个逻辑问题。我有一个带有模板、值、行、列的mongodb。例如$record->{template}它是T1和$record->{column}1和$record->{row}我有一些日期(“d.m.Y”)。我需要根据$record->{row}和$record->{column}排列@insert_数据值

问题是我不能在insert语句中使用@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"){

    }   
}
}

谢谢

我注意到您没有给我们任何错误消息,但我认为这些信息可能有用:

@array\u name[integer]
是一个单元素数组切片。
$array\u name[integer]
是数组中的标量值


我建议您将值传递到
execute
语句中,而不是数组。

我注意到您没有给我们任何错误消息,但我认为这些信息可能有用:

@array\u name[integer]
是一个单元素数组切片。
$array\u name[integer]
是数组中的标量值


我建议您将值传递到
execute
语句中,而不要传递数组。

如果将数组的连续槽传递给方法,那么这样做就大错特错了。您永远不需要将
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};
}
请记住,切片表示法(
@a[$i..$j]
)意味着它将发送6个位置值作为参数。这可能很重要,因为在您的实现和我的实现中,如果
$record->{column}
为1,那么数组就是
[unde,$record->{VALUE}]
;它只包含两个元素,分别位于偏移量0和偏移量1处

如果没有切片表示法,您将在
$record->{template}
之前传递两个参数,这可能是意外的。但是切片表示法确保数组中实际分配了多少个插槽,结果表达式将占据6个位置(其中5个为
undef

但最重要的是,对于像你这样的新手,通常:

use strict;
use warnings;
这需要放在代码的顶部。如果你不理解一个导致脚本死机的错误,你可以很容易地在
perlfaq
中查找它,用谷歌搜索解决方案也很容易

如果您不理解
警告
发出的消息,也可以在代码顶部插入此库:

use diagnostics -verbose;

这可能会给你比你想读的更多的解释。

如果你将数组的连续槽传递给一个方法,你就大错特错了。你不应该需要传递
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};
}
请记住,切片表示法(
@a[$i..$j]
)意味着它将发送6个位置值作为参数。这可能很重要,因为在您的实现和我的实现中,如果
$record->{column}
为1,那么数组就是
[unde,$record->{VALUE}]
;它只包含两个元素,分别位于偏移量0和偏移量1处

如果没有切片表示法,您将在
$record->{template}
之前传递两个参数,这可能是意外的。但是切片表示法确保数组中实际分配了多少个插槽,结果表达式将占据6个位置(其中5个为
undef

但最重要的是,对于像你这样的新手,通常:

use strict;
use warnings;
这需要放在代码的顶部。如果你不理解一个导致脚本死机的错误,你可以很容易地在
perlfaq
中查找它,用谷歌搜索解决方案也很容易

如果您不理解
警告
发出的消息,也可以在代码顶部插入此库:

use diagnostics -verbose;

这可能会给你比你想读的更多的解释。

最好在
$stmt->execute
之后添加检查

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

使用strict;
也会有帮助。

$stmt->execute
之后添加检查将非常有用

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

使用strict;
也会有帮助。

谢谢你的回答。我理解错的地方和其他解释。如果你能帮助我,我还有一个问题……我忘了提到所有数据都是相关的。我需要在同一行插入所有数据。例如:$record->{row}=1和$record->{column}[1..6]=我的postgresql数据库中有一条记录。现在,postgresql中有6条记录。谢谢你的回答。我理解错在哪里以及其他解释。如果你能帮助我,我还有一个问题…我忘了提到所有数据都是相关的。我需要在同一行中插入所有数据。例如