8

我收到一条运行我的 Perl 脚本之一的警告。错误是在一个简单的if语句中引发的,我正在测试数组中的字符串是否等于另一个字符串。

我和我的同事尝试了几种情况,但仍然无法解决警告。到目前为止,我已经尝试将我所有的研究都放在这个线程中,所以它有点长,但请坚持下去。我完全被困住了,希望 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 数据库中。

文本文件有几个可以按不同顺序排列的字段,这就是为什么我使用 switch 样式 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"我就会收到警告。

我什至可以在声明之前打印出 $pieces[0] if,它会打印“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 关心我测试的顺序?请注意,我正在测试我的 if-elsif 语句中没有给出此警告的多个 elsif 的其他几个字符串。

有任何想法吗?我真的需要清除此警告,以免它在运行时淹没控制台。该脚本正在处理警告。

确切的错误是:

在 japdpmrijob.pl 第 250 行的字符串 eq 中使用未初始化的值。

确切的错误行(使用 PerlIDE.exe 中的 Perl 调试实用程序确定)是:

if ($pieces[0] eq "PromotionNumber") {

我可以打印出 $pieces[0] 并查看价值。所以我知道它是用我的价值定义的。我还可以打印出 $pieces[1] 并查看我的预期值。如果我首先测试 $pieces[0] eq "Level",警告就会消失,我可以访问这两个变量。

我还是一头雾水……

看起来错误实际上是被标记为变量的“eq”。有什么想法吗?

您会在下面找到大量代码。我包括了整个for循环和我正在使用的几个变量。请注意elseif-elsif-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";
    }
}
4

2 回答 2

9

我认为您正在错误的地方寻找错误。对于在语句或其他复杂代码块内触发的警告if-elsif-else,旧版本的 Perl 可能会将警告识别为发生在语句的第一行。

------ 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.
于 2012-08-28T20:24:54.843 回答
2

您可以在进行比较之前检查是否$pieces[0]已定义。大多数情况下,这将阻止警告:

my @pieces = split(/=/, $var);
my $label = defined($pieces[0]) ? $pieces[0] : ""; #if not defined init to ""
my $value = defined($pieces[1]) ? $pieces[1] : "";
if($label eq "PromotionNumber") {
     $promoNumber = $value;
} elsif ($label eq "Type") {
#More similar code follows
于 2012-08-28T19:45:25.677 回答