[英]Can't find my error
嗨,这是我正在处理的一个非常大的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 '?'
由于我对Perl相当陌生,所以如果我不得不猜测,我会在这里说一下
join( ',', map { $column_mapping{$_} } @$headers ),
join( ',', ('?') x scalar @$headers );
我认为标头或其他内容的数据类型错误,但我不确定是什么问题,它只是在这些行附近崩溃。
如果您碰巧看到我做错了,那太好了:)
您的主要错误是未在Perl代码顶部添加use strict
和use warnings
。 这些行会发现许多通常潜入Perl程序的问题。 他们会发现这个问题。
问题是您声明了一个名为@headers
的数组。
my @headers = split(',', $headd);
但是,下次尝试使用它时,您假设它是一个称为$headers
的数组引用 。
join( ',', map { $column_mapping{$_} } @$headers )
在Perl中, $headers
和@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
定义之后移动此语句(出于显而易见的原因)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.