String'eq'Perl中未初始化的值

时间:2012-08-28 19:38:33

标签: string perl warnings initialization

我收到运行我的一个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数据库中。

文本文件有几个可以按不同顺序排列的字段,这就是我使用开关样式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关心我测试的订单?请注意,我正在我的if-elsif语句中测试SEVERAL其他多个elsif的字符串,这些字符串不会发出此警告。

有什么想法吗?我真的需要清除此警告,以便在运行时不会使控制台泛滥。该脚本正在处理警告。

确切错误是:

  

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

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

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

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

我仍然感到困惑......

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

下面你会发现很大一部分代码。我包含了整个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";
    }
}

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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