我和我的同事尝试了几种情况,仍然无法解决警告.到目前为止,我已经尝试将我的所有研究都放到这个帖子中,所以它有点长,但请坚持下去.我完全陷入困境,并希望Stack Overflow的一个伟大思想可以帮助我!
产生问题的代码是:
if ($pieces[0] eq "PromotionNumber")
该部分的代码块是:
my @pieces = split(/=/,$var); if($pieces[0] eq "PromotionNumber") { $promoNumber = $pieces[1]; } elsif ($pieces[0] eq "Type") { # More similar code follows
我在上面的代码中的目标是将我在文本文件中找到的所有变量分配给相应的Perl变量.然后我将这些找到的变量插入到sql数据库中.
文本文件有几个可以按不同顺序排列的字段,这就是我使用开关样式if-elsif …来完成赋值的原因.还有一些我不关心的领域,比如Level,我只是忽略这些领域.但是,这些字段是导致警告的字段.
$var在循环时设置为以下内容…
PromotionNumber=000 RecordOffset=0 Code=0 SubCode=1 Level=0
当我点击“Level = 0”时,我可以在PerlIDE.exe调试器中暂停,看到该字符串被拆分为Level和0并插入到数组中.但是,一旦代码进入if语句并测试$pieces [0] eq“PromotionNumber”,我就会收到警告.
我甚至可以在if语句之前打印$pieces [0],它将打印“Level”.
如果我将代码更改为以下警告消失…
my @pieces = split(/=/,$var); if($pieces[0] eq "Level") { #My problematic variable test }elsif($pieces[0] eq "PromotionNumber") { $promoNumber = $pieces[1]; } elsif ($pieces[0] eq "Type") { #More similar code follows
但是,如果我测试第二级“Level”字符串,警告会返回.以下代码有警告.
my @pieces = split(/=/,$var); if($pieces[0] eq "PromotionNumber") { #My problematic variable test }elsif($pieces[0] eq "Level") { $promoNumber = $pieces[1]; } elsif ($pieces[0] eq "Type") { #More similar code follows
为什么Perl关心我测试的订单?请注意,我正在测试SEVERAL其他字符串,这些字符串在我的if-elsif语句中没有给出此警告的多个elsif.
有任何想法吗?我真的需要清除此警告,以便在运行时不会使控制台泛滥.该脚本正在处理警告.
确切的错误是:
Use of uninitialized value in string eq at japdpmrijob.pl line 250.
确切的错误行(使用Perl的PerlIDE.exe中的调试实用程序确定)是:
if ($pieces[0] eq "PromotionNumber") {
我可以打印$pieces [0]并查看值.所以我知道它是用我的价值来定义的.我也可以打印出$pieces [1]并查看我的预期价值.如果我先测试$pieces [0] eq“Level”,警告就会消失,我可以访问这两个变量.
我还是很困惑……
下面你会发现很大一部分代码.我包括了整个for循环以及我正在使用的几个变量.注意if-elsif-else序列末尾的else语句,我添加了这个以尝试停止警告,如第三个答案所述.每次调用警告时,此else语句都会打印我的预期值,因此我知道值存在.
for my $cond (@conditions) { if($debug==1){print $cond."\n";} # required database variables my $isRecord = 0; my $promoNumber; my $type; my $process; my $testValue; my $recordOffset; my $code; my $subcode; my $itemType; my $itemValue; # Function test variables my $itemTypeVar; my $newQualifier = 1; # Database Configuration my $dbApps = new Win32::ODBC("myDatabase") || die "Error: " . Win32::ODBC::Error(); my @condVars = split(/\|/,$cond); for my $var (@condVars) { if($debug==1){print $var."\n";} my @pieces = split(/=/,$var); if( defined($pieces[0]) ){ print "piece 0 defined!\n"; } else { print "pieces 0 not defined!\n"; } if( defined($pieces[1]) ){ print "piece 1 defined!\n"; } else { print "piece 1 not defined!\n"; } if($pieces[0] eq "PromotionNumber"){ $promoNumber = $pieces[1]; } elsif ($pieces[0] eq "Type"){ $type = $pieces[1]; } elsif ($pieces[0] eq "Process"){ $process = $pieces[1]; } elsif ($pieces[0] eq "TestValue"){ $testValue = $pieces[1]; } elsif ($pieces[0] eq "RecordOffset"){ $recordOffset = $pieces[1]; if ($recordOffset == 0) { $newQualifier = 1; } } elsif ($pieces[0] eq "Code"){ $code = $pieces[1]; } elsif ($pieces[0] eq "SubCode"){ $subcode = $pieces[1]; } elsif ($pieces[0] eq "ItemType"){ $itemType = $pieces[1]; if($itemType eq "0") { $itemTypeVar = "ItemCode"; } elsif($itemType eq "1") { $itemTypeVar = "ItemCode"; } elsif($itemType eq "2") { $itemTypeVar = "Department"; } elsif($itemType eq "5") { $itemTypeVar = "MixMatchCode"; } elsif($itemType eq "12") { $itemTypeVar = "GroupCode"; } } elsif ($pieces[0] eq $itemTypeVar){ $itemValue = $pieces[1]; } else { print "$pieces[0] and $pieces[1] not used.\n"; } print "$var\n"; } }
解决方法
------ warn.pl ------ my $x = 0; my $y; if ($x == 1) { # line 3 } elsif ($x == 2) { } elsif ($x == 3) { } elsif ($y == 4) { # line 7 } $perl5.14.2 -w warn.pl Use of uninitialized value $y in numeric eq (==) at warn.pl line 7. $perl5.8.6 -w warn.pl Use of uninitialized value in numeric eq (==) at line 3.