0

我正在尝试从表中获取某些列,某些列可能具有空值。因此,在填充我的主要数据之前,我正在检查空值的哈希值。由于某些键具有空值并发出警告。

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

    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++;
    }
4

2 回答 2

2

当然有:defined函数。

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

或者,由于undef计算结果为假,您可以使用短路 OR 运算符在一个步骤中分配其他内容,而无需显式检查。

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

更新:

正如评论所建议的那样,如果您的0值也评估为假,那么单线是危险的。所以你可以这样做:

$dbData{$counter}{$key} = defined $hashRef->{$key} ? $hashRef->{$key} : '';
于 2013-02-03T14:00:39.900 回答
1

如果对值的测试表现得如您所愿,并且您只想使警告静音,则可以no warnings 'uninitialized'在测试周围的小范围内使用。这是 IMO 最不重要的警告类别之一;事实上,我几乎将其称为调试功能而不是适当的警告。

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

编辑

我不确定投反对票的目的是什么,但让我附和一些 Perl 世界中常见的观点。warningsstrict就此而言)很棒并且应该始终使用,除非您知道为什么出于某种原因关闭其中的一小部分。有时未初始化的值应该是虚假和沉默的,这没关系。当你知道那是你想要的时候,把它关掉而不是跳过|| ''篮球;它更自我记录。

于 2013-02-03T14:12:29.993 回答