我认为我的代码中存在逻辑问题。我有一个带有模板、值、行、列的 mongodb。例如 $record->{template} 它是 T1 和 $record->{column} 1 和 $record->{row} 我有一些日期(“d.m.Y”)。我需要根据 $record->{row} 和 $record->{column}
安排 @insert_data 值问题是我不能在该插入语句中使用@insert_data[1] 或@insert_data[2] 或..etc,但我不明白为什么,我不明白我该如何解决我的问题。
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"){
}
}
}
谢谢!
最佳答案
如果您将数组的连续槽传递给方法,那您就大错特错了。您永远不需要将 func( $a[1], $a[2], ... $a[n], ...
传递给子程序。单独传递它们将 确保使用参数槽,这样您就不会比预期更早地遇到 $record->{template}
,但是 slice notation 也是如此。 (@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} );
请记住,slice 符号 (@a[$i..$j]
) 意味着它将发送 6 个位置值作为参数。这可能很重要,因为在您的实现和我的实现中,如果 $record->{column}
为 1,则数组只是 [undef, $record->{VALUE} ]
;它只有 2 个元素,分别位于偏移量 #0 和偏移量 #1。
如果没有切片符号,您将在 $record->{template}
之前传递两个 参数——这可能是意想不到的。但是切片表示法确保无论实际分配和分配了多少个数组槽,结果表达式都将占用 6 个位置(其中 5 个将是 undef
)。
但首先,对于像您这样的新手,USUW:
use strict;
use warnings;
这需要放在代码的顶部。如果您不理解严格终止脚本的错误,您可以轻松地在 perlfaq
中查找它,谷歌搜索解决方案也很容易。
如果您不理解 warnings
给出的消息,那么您也可以在代码顶部插入此库:
use diagnostics -verbose;
这往往会给您比您想阅读的更多的解释。
关于arrays - postgresql 插入语句中的 perl 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16587216/