arrays - postgresql 插入语句中的 perl 数组

标签 arrays perl postgresql mongodb if-statement

我认为我的代码中存在逻辑问题。我有一个带有模板、值、行、列的 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/

相关文章:

c++ - 将数组中的元素设置为 0 或 NULL

java - 使用java中的冒泡排序查找数组中第一个第二大的数字及其位置

database - 我们可以通过替换Postgres来使用Elastic Search作为后端数据存储吗?

sql - LEFT 外部连接条件

ruby-on-rails - 尝试将本地数据库推送到 Heroku 后出现 "ActionView::Template::Error (Unknown primary key for table"

arrays - 打印 Core Data bool 数组返回换行符

php - 如何通过PHP中的关联数组将两个值传递给一个变量

Perl & MongoDB 二进制数据

python - 需要帮助将 perl 正则表达式转换为 python

perl - "Useless use of a variable in void context"在这个 Perl 脚本中是什么意思?