嗨,这是我正在研究的一个非常大的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 '?'
我认为标题或其他内容的数据类型错误,但我不完全确定问题是什么,它只是在这些行周围崩溃。
如果你碰巧看到我做错了什么就会很棒:)
答案 0 :(得分:2)
您的主要错误是未将use strict
和use 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
的定义之后移动此声明(希望显而易见的原因)。