繁体   English   中英

找不到我的错误

[英]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 strictuse 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM