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
ループ全体と、使用している変数のいくつかを含めました。else
if-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";
}
}