perl warning:“在字符串ne中使用未初始化的值”,用于对具有空值的列进行条件检查

时间:2013-02-03 13:55:20

标签: perl warnings dbi dbix-class

我正在尝试从表中获取某些列,某些列可能具有null值。在填充我的主数据之前,我正在检查散列是否为null值。由于某些键具有null值,发出警告。

有没有办法检查哈希键是否没有值来阻止警告。

    my $counter = 1;
    while ( my $hashRef = $queryHandle1->fetchrow_hashref) {

       foreach my $key (keys %{$hashRef} ) {
        if ( $hashRef->{$key} ne "" ) { #some of the coloumn of table has null value
                    #warning is coming for the if check
            $dbData{$counter}{$key} = $hashRef->{$key};
        }
        else {
            $dbData{$counter}{$key} = "";
        }

       }
       $counter++;
    }

2 个答案:

答案 0 :(得分:2)

当然有:defined功能。

if (defined $hashRef->{$key}) {...}

或者,由于undef的计算结果为false,因此您可以使用短路OR运算符在一步中分配其他内容而无需进行明确检查。

$dbData{$counter}{$key} = $hashRef->{$key} || '';

<强>更新

根据评论的建议,如果您的0值也会评估为false,那么单行是危险的。所以你可以这样做:

$dbData{$counter}{$key} = defined $hashRef->{$key} ? $hashRef->{$key} : '';

答案 1 :(得分:1)

如果测试值的行为符合您的喜好并且您只想使警告静音,则可以在测试周围的小范围内使用no warnings 'uninitialized'。这是国际海事组织最不重要的警告类别之一;事实上,我几乎称之为调试功能,而不是正确的警告。

那就是说,如果您要测试的是该值是否已定义,则应使用defined函数作为stevenl建议。

修改

我不确定downvote的用途是什么,但让我回应一些Perl世界常见的情绪。 warnings(以及strict就此而言)很棒,应该永远使用,除非您知道为什么要将某些部分内容因特定原因而关闭。有时未初始化的值应该是假的和沉默的,这没关系。当你知道这就是你想要的时候,就把它关掉而不是跳过|| ''箍;它更加自我记录。