0

テーブルから特定の列をフェッチしようとしていますが、一部の列に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++;
    }
4

2 に答える 2

2

確かにあります:defined関数。

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

または、undeffalse と評価されるため、短絡 OR 演算子を使用して、明示的なチェックなしで 1 つのステップで別のものを割り当てることができます。

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

アップデート:

0コメントで示唆されているように、 false と評価される値がある場合、ワンライナーは危険です。したがって、代わりにこれを行うことができます:

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

値のテストが好きなように動作し、単に警告を消したい場合はno warnings 'uninitialized'、テストの小さなスコープで使用できます。これは、IMO で最も重要でない警告カテゴリの 1 つです。実際、私はこれを適切な警告ではなく、デバッグ機能と呼んでいます。

つまり、値が定義されているかどうかをテストしている場合は、definedstevenlが提案するように関数を使用する必要があります。

編集

反対票が何のためのものかはわかりませんが、Perl の世界の一部に共通する感情を繰り返してみましょう。warnings(さらにstrict言えば) は素晴らしいので、特定の理由で一部をオフにする理由がわかっている場合を除いて、常に使用する必要があります。場合によっては、初期化されていない値は偽りで無音であるべきですが、それで問題ありません。|| ''それが必要なことがわかっている場合は、フープを飛び越えるのではなく、オフにするだけです。そのより自己文書化。

于 2013-02-03T14:12:29.993 に答える