8

Perlスクリプトの1つを実行すると警告が表示されます。ifエラーは、配列内の文字列が別の文字列と等しいかどうかをテストしている単純なステートメントでスローされています。

同僚と私はいくつかのシナリオを試しましたが、それでも警告を解決できませんでした。私はこれまでのすべての研究をこのスレッドに入れようとしたので、少し長いですが、それを続けてください。私は完全に立ち往生しており、Stack Overflowの優れた精神の1つが私を助けてくれることを願っています!

問題を生成するコードは次のとおりです。

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...を使用します。レベルなど、気にしないフィールドもいくつかありますが、これらのフィールドは無視します。ただし、これらのフィールドは警告の原因となるフィールドです。

$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

ただし、「レベル」文字列を2番目にテストすると、警告が返されます。以下のコードには警告があります。

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") {

$ piece [0]を印刷して、値を確認できます。だから私はそれが私の価値で定義されていることを知っています。$ piece [1]を印刷して、期待値を確認することもできます。最初に$pieces[0] eq "Level"をテストすると、警告が消え、両方の変数にアクセスできます。

私はまだ混乱しています...

エラーは実際には「eq」が変数としてフラグ付けされているようです。それについて何かアイデアはありますか?

以下に、コードの大部分があります。forループ全体と、使用している変数のいくつかを含めました。elseif-elsif-elseシーケンスの最後にあるステートメントに注意してください。これを追加して、3番目の回答で示されているように警告を停止しようとしました。この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 に答える