2012-08-28 6 views
6

में अनियमित मूल्य मुझे मेरी पर्ल स्क्रिप्ट्स में से एक को चलाने की चेतावनी मिल रही है। त्रुटि को एक साधारण if कथन पर फेंक दिया जा रहा है जहां मैं परीक्षण कर रहा हूं यदि सरणी में एक स्ट्रिंग किसी अन्य स्ट्रिंग के बराबर है।स्ट्रिंग 'ईक' पर्ल

मेरे सहकर्मी और मैंने कई परिदृश्यों की कोशिश की है और अभी भी चेतावनियों को हल करने में सक्षम नहीं हैं। मैंने अपने सभी शोध को इस धागे में अब तक रखने की कोशिश की है, इसलिए यह थोड़ा लंबा है, लेकिन कृपया इसके साथ चिपके रहें। मैं पूरी तरह से अटक गया हूं और आशा करता हूं कि स्टैक   ओवरफ्लो के महान दिमाग में से एक मेरी मदद कर सकता है!

कोड समस्याओं को पैदा करने है:

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 

उपरोक्त कोड में मेरा लक्ष्य सभी चर मैंने पाया आवंटित करने के लिए है संबंधित पर्ल चर के लिए एक पाठ फ़ाइल में। मैं फिर उन पाए गए चर को SQL डेटाबेस में सम्मिलित करता हूं।

टेक्स्ट फ़ाइल में कई फ़ील्ड हैं जो अलग-अलग ऑर्डर में हो सकते हैं, यही कारण है कि मैं स्विच शैली को पूरा करने के लिए स्विच शैली if-elsif ... का उपयोग करता हूं। ऐसे कुछ क्षेत्र भी हैं जिन पर मुझे परवाह नहीं है, जैसे स्तर, और मैं इन क्षेत्रों को अनदेखा करता हूं। हालांकि ये क्षेत्र ऐसे क्षेत्र हैं जो चेतावनियां पैदा करते हैं।

$var निम्नलिखित के लिए निर्धारित है के रूप में यह के माध्यम से लूप ...

PromotionNumber=000 
RecordOffset=0 
Code=0 
SubCode=1 
Level=0 

जब मैं हिट "स्तर = 0", मैं PerlIDE.exe डीबगर में रोक सकते हैं और देखते हैं कि स्ट्रिंग विभाजित है सकते हैं स्तर और 0 में और सरणी में डाला गया। हालांकि, जैसे ही कोड if कथन के लिए आगे बढ़ता है और $pieces[0] eq "PromotionNumber" परीक्षण करता है मुझे चेतावनी मिलती है।

मैं if कथन से ठीक पहले $ 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 

पर्ल देखभाल किस आदेश में मैं परीक्षण करता हूं? ध्यान दें, कि मैं अलग-अलग तारों का परीक्षण कर रहा हूं जो मेरे इल्स-एलीफ कथन में एकाधिक एल्सिफ़ नीचे हैं जो इस चेतावनी को नहीं देते हैं।

कोई विचार? मुझे वास्तव में इस चेतावनी को साफ़ करने की आवश्यकता है ताकि चलते समय कंसोल बाढ़ न हो। हालांकि लिपि चेतावनियों के साथ काम कर रही है।

सटीक त्रुटि है: japdpmrijob.pl लाइन 250.

त्रुटि की सटीक लाइन (PerlIDE में पर्ल के डिबग उपयोगिता का उपयोग करके निर्धारित में स्ट्रिंग eq में अप्रारंभीकृत मूल्य की

का प्रयोग करें।exe) है:

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

मैं $ टुकड़े प्रिंट कर सकता हूं [0] और मूल्य देख सकता हूं। तो मुझे पता है कि यह मेरे मूल्य के साथ परिभाषित किया गया है। मैं $ टुकड़े भी प्रिंट कर सकता हूं [1] और मेरा अपेक्षित मूल्य देख सकता हूं। यदि मैं पहले $ [0] eq "स्तर" के लिए परीक्षण करता हूं, तो चेतावनी दूर हो जाती है और मैं दोनों चरों तक पहुंच सकता हूं।

मैं अभी भी उलझन में हूँ ...

ऐसा लगता है कि त्रुटि वास्तव में "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

लगभग निश्चित रूप से समस्या '$ टुकड़े [1] 'अभिव्यक्ति है, न कि $ टुकड़े [0]'। यदि आपके पास '=' के बिना '$ var' का मान है (उदाहरण के लिए एक खाली रेखा) 'विभाजन' एक आइटम की एक सूची वापस कर देगा। "टाइप" और "लेवल" के लिए आपके परीक्षण केवल पहले तत्व को देखते हैं और काम करेंगे, लेकिन "प्रोमोशन नम्बर" के तहत ब्लॉक गैर-मौजूद दूसरे तत्व को देखने की कोशिश करता है और चेतावनी उत्पन्न करता है। –

+1

कृपया आपको जो सटीक त्रुटि मिल रही है उसे पोस्ट करें। यह स्पष्ट नहीं है कि कौन सी रेखा समस्या पैदा कर रही है। – chepner

+0

साथ ही, क्या हमें कोड के अधिक से अधिक दिखाना संभव होगा (कम से कम लूप जो '$ var' के मान को सेट करता है)। यह एक बहुत अजीब समस्या है। – chepner

उत्तर

9

मुझे लगता है कि आप गलत जगह में त्रुटि की तलाश में हैं। if-elsif-else कथन या कोड के अन्य जटिल ब्लॉक के अंदर ट्रिगर की गई चेतावनी के लिए, पर्ल के पुराने संस्करण कथन की पहली पंक्ति पर होने वाली चेतावनी की पहचान कर सकते हैं।

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

हमारे पास नीचे एक और है जो होना चाहिए "सबको पकड़ो"।मुझे कोड को क्षणिक रूप से पोस्ट करना चाहिए था। लेकिन, मेरे सहकर्मियों और मैंने माना है कि कोड कहीं और हो सकता है, लेकिन हम काफी सकारात्मक हैं कि यह "if-elsif" परीक्षणों के संयोजन में है। – Kyle

+1

आपके इनपुट के आधार पर, ऐसा लगता है कि आपको "ItemType" लाइन का सामना करने से पहले "स्तर = 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 (परिभाषित ($ टुकड़े [0]) जोड़ने की कोशिश की) {प्रिंट" परिभाषित! "; } else {प्रिंट "परिभाषित नहीं!"; } 'अगर कथन में समस्याग्रस्त से ठीक पहले। यह मेरी समस्या परीक्षण सहित प्रत्येक एकल परीक्षण के लिए परिभाषित प्रिंट करता है, फिर भी मुझे 'if ($ pieces [0] eq" PromotionNumber ") {कोड की पंक्ति 'पर चेतावनी देता है। मैं पूरी तरह से स्टंप कर रहा हूं कि पर्ल किस बारे में शिकायत कर रहा है! – Kyle

+2

पर्ल 5.10 के बाद से, '//' ऑपरेटर 'परिभाषित ... को बदल देता है? ...: 'आपके पास निर्माण है -' मेरा $ लेबल = $ टुकड़े [0] // '' – mob

+0

@mob जानना अच्छा है। मैं 5.8.6 का उपयोग करने के साथ अटक गया हूं इसलिए मैं उन प्रकार के नस्लों में थोड़ा पीछे हूं। – scrappedcola