2012-08-28 5 views
6

내 Perl 스크립트 중 하나를 실행하는 경고가 나타납니다. 배열의 문자열이 다른 문자열과 같은지 테스트하는 간단한 if 문에서 오류가 발생합니다.String 'eq'Perl의 초기화되지 않은 값

동료와 여러 가지 시나리오를 시도했지만 여전히 경고를 해결하지 못했습니다. 지금까지 모든 연구를이 스레드에 넣으려고 했으므로 조금 길어졌지만 그대로 사용하십시오. 나는 완전히 붙어있어 스택의 위대한 마음 중 하나를 기대하고있다   오버플로 나를 도울 수있다!

문제를 생성하는 코드는 다음과 같습니다

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 

내가 공격 "레벨 = 0", 나는 PerlIDE.exe 디버거에서 일시 정지 문자열을 분할이라고 볼 수있다 레벨 및 0으로 삽입하여 배열에 삽입하십시오. 그러나 코드가 if 문으로 넘어 가서 $pieces[0] eq "PromotionNumber"을 테스트하자마자 경고 메시지가 나타납니다.

if 문 바로 앞에 $ pieces [0]을 인쇄 할 수 있으며 "수준"이 인쇄됩니다. 나는에 코드를 변경하는 경우

내가 두 번째 "수준"문자열을 테스트 할 경우, 그러나 ... 경고가 사라집니다

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 

다음은 경고가 다시 온다. 아래 코드에는 경고가 있습니다.

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 

왜 내가 어떤 순서로 테스트합니까? 참고,이 경고를주지 않는 if-elsif 문에서 여러 개의 elsif가있는 여러 문자열을 테스트하고 있습니다.

아이디어가 있으십니까? 이 경고를 지워서 콘솔을 넘치지 않도록해야합니다. 스크립트는 경고와 함께 작동합니다.

정확한 오류는 다음과 같습니다 japdpmrijob.pl 라인 PerlIDE 펄의 디버그 유틸리티를 사용하여 측정 오류 (250)

정확한 라인 (에서 문자열 EQ에서 초기화되지 않은 값의

사용.exe)는 다음과 같습니다.

if ($pieces[0] eq "PromotionNumber") { 

나는 $ pieces [0]을 출력하고 그 값을 볼 수 있습니다. 그래서 나는 그것이 내 가치로 정의된다는 것을 압니다. 또한 $ pieces [1]을 인쇄하고 예상 한 가치를 볼 수 있습니다. 먼저 $ pieces [0] eq "Level"을 테스트하면 경고가 사라지고 두 변수에 모두 액세스 할 수 있습니다.

난 아직도 혼란 스러워요 ...

오류가 실제로 변수로 플래그되는 "EQ"입니다 것 같습니다. 그것에 대한 아이디어가 있습니까?

아래에는 많은 코드가 있습니다. 나는 전체 for 루프와 함께 일하고있는 몇 가지 변수를 포함 시켰습니다. if-elsif-else 시퀀스 마지막 부분에 else 문이 있음을 알 수 있습니다. 세 번째 답변에서 언급 한 경고를 중지하기 위해이 코드를 추가했습니다. 이 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"; 
    } 
} 
+0

거의 확실하게 문제는'$ pieces [0]'이 아닌'$ pieces [1]'표현식입니다. 값이'$ var'의 값이'='(공백 라인 등) 인 경우,'split'는 단일 항목의리스트를 돌려줍니다. "유형"및 "레벨"에 대한 테스트는 첫 번째 요소 만보고 작동하지만 "PromotionNumber"아래의 블록은 존재하지 않는 두 번째 요소를 살펴보고 경고를 생성합니다. –

+1

정확한 오류를 게시하십시오. 문제를 일으키는 라인은 분명하지 않습니다. – chepner

+0

또한, 더 많은 코드 (적어도'$ var'의 값을 설정하는 for 루프)를 보여줄 수 있습니다. 이것은 매우 이상한 문제입니다. – chepner

답변

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. 
+0

아래쪽에 else가 있어야합니다. "잡아라".나는 코드를 잠깐 게시해야한다. 그러나 제 동료들과 저는이 코드가 다른 곳에있을 수 있다고 생각했지만 테스트의 "if-elsif"조합에 대해서는 매우 긍정적입니다. – Kyle

+1

입력 내용에 따라 "ItemType"줄이 나타나기 전에 "Level = 0"줄이있는 것 같습니다. 이것은 최종'elsif' 절을 치면'$ itemTypeVar'가 아직 정의되지 않았 음을 의미합니다. @mob이 지적했듯이,이 경고는 아마도 여러분의 커다란'if-elsif-else' 문장의 초기 절에 기인 할 것입니다. – chepner

+0

@chepner 감사합니다. 나는 앞서 가서 마피아의 대답을 옳은 것으로 표시했지만, 아마 내 오류를 일으키는 완전히 다른 변수라는 것을 알아 내기 위해 어리석은 짓을했을 것이다. 나는 왜 내가 그 변수에 대해서도 테스트하지 않을 것이라고 생각하지 않습니다. $ itemTypeVar이 테스트되기 전에 정의되었는지 확인하여 모든 오류가 사라졌습니다. 모두에게 많은 감사를드립니다! – Kyle

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 
+0

나는'if (defined ($ pieces [0])) {print "DEFINED!"; } else {print "NOT DEFINED!"; }'문제가있는 if 문 바로 앞에. 내 문제 테스트를 포함하여 모든 단일 테스트에 대해 정의 된 내용을 인쇄 한 다음'if ($ pieces [0] eq "PromotionNumber") {'코드 행에 대해 경고 메시지를 표시합니다. 나는 Perl이 불평하는 것에 관해서 완전히 비틀어졌다! – Kyle

+2

Perl 5.10부터,'// 연산자는'defined ...? ... :'당신이 가지고있는 건설 -'my $ label = $ pieces [0] // ''' – mob

+0

@mob 잘 알고 있습니다. 나는 5.8.6을 사용하는 데 어려움을 겪었으므로 이런 종류의 미묘한면에서 약간 뒤떨어져있다. – scrappedcola

관련 문제