无法找到我的错误

时间:2015-08-05 14:47:33

标签: mysql sql arrays perl

嗨,这是我正在研究的一个非常大的perl程序的小片段,但我相信错误是围绕这一部分。

box-shadow: inset -11px 0 9px -11px rgba(0,0,0,0.7);

因为我对perl很新,如果我不得不猜测我会说它在这里

my $headd = "test,test1,test2,test3,ect";
my @headers = split(',', $headd);

CONNECT TO DATABASE STUFF THAT WORKS FINE

 my %column_mapping = (
    "GPS ALT" => 'GPS_ALT',
    "GPS DTS" => 'GPS_DTS',
    "GPS FIX" => 'GPS_FIX',
    "GPS HDG" => 'GPS_HDG'
 )

my $sql       = sprintf 'INSERT INTO tablename ( %s ) VALUES ( %s )',
   join( ',', map { $column_mapping{$_} } @$headers ),
   join( ',', ('?') x scalar @$headers );   # note the list around the '?'

我认为标题或其他内容的数据类型错误,但我不完全确定问题是什么,它只是在这些行周围崩溃。

如果你碰巧看到我做错了什么就会很棒:)

1 个答案:

答案 0 :(得分:2)

您的主要错误是未将use strictuse warnings添加到Perl代码的顶部。这些行会发现许多经常潜入Perl程序的问题。他们会发现这个问题。

问题是您声明了一个名为@headers的数组。

my @headers = split(',', $headd);

但是下次尝试使用它时,您假设它是一个名为$headers的数组引用

join( ',', map { $column_mapping{$_} } @$headers )

在Perl中,$headers@headers是两个完全不同的变量,它们之间绝对没有连接。由于您从未给过$headers一个值,因此尝试取消引用它(@$headers)永远不会顺利。

但是你已经从评论中解决了这个问题。您已提出建议的解决方法(将@$headers替换为@headers),现在您收到了其他错误:

  

问题在于我在连接中有一个初始化值

我认为你的意思是"未初始化" : - )

听起来问题出在我们上面讨论的同一行(现在使用固定语法):

join( ',', map { $column_mapping{$_} } @headers )

那么这里发生了什么?好吧,我们正在有效地将价值转化为新的价值观。对于@headers中的每个值,我们会在%column_mappings中查找并返回哈希值中的相关值。

怎么能给我们一个未定义的值?那么,如果我们在哈希中实际存在的哈希中查找密钥会发生什么呢? Perl为我们提供了特殊价值" undef"。哪会引发你的警告。

所以我建议您仔细检查@headers中的值(这将是$headd中的值),并确保所有这些可能的值都有%column_mappings中的关联键。

一种解决方法是在map中设置默认值。也许是这样的事情:

join( ',', map { $column_mapping{$_} // 'MISSING MAPPING' } @$headers )

这几乎肯定会在某个时候进一步打破你的数据库交互 - 但至少问题显而易见!

更新:在有问题的值进入@headers之前消除它们:

my @headers = grep { exists $column_mapping{$_} } split(',', $headd);

您希望在%column_mappings的定义之后移动此声明(希望显而易见的原因)。