Valeur non initialisée dans la Chaîne 'eq' Perl

Je reçois un avertissement de l'exécution de l'un de mes scripts Perl. L'erreur est renvoyée à un simple if déclaration où je teste si une chaîne de caractères en un tableau est égale à une autre chaîne.

Ma collègue de travail et j'ai essayé plusieurs scénarios et je n'ai toujours pas réussi à résoudre les avertissements. J'ai essayé de placer toutes mes recherches jusqu'à présent dans ce thread, donc c'est un peu long, mais s'il vous plaît rester avec elle. Je suis complètement coincé et en espérant que l'un des grands esprits de Pile Overflow peut m'aider!

Le code générer des problèmes qui se posent est:

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

Le bloc de code autour de cette section est:

my @pieces = split(/=/, $var);
if($pieces[0] eq "PromotionNumber") {
     $promoNumber = $pieces[1];
} elsif ($pieces[0] eq "Type") {
# More similar code follows

Mon but dans le code ci-dessus est à attribuer toutes les variables que j'ai trouvé dans un fichier texte à l'Perl variables. J'ai ensuite insérer ces trouvé des variables dans une base de données SQL.

Le fichier texte a plusieurs champs qui peuvent être dans un ordre différent, c'est pourquoi j'ai utiliser le commutateur de style if-else... pour accomplir l'affectation de valeurs. Il y a aussi certains domaines, je ne se soucient pas, telles que le Niveau, et je viens d'ignorer ces domaines. Ces champs sont cependant les champs qui causent les avertissements.

La $var est la suivante, comme il parcourt...

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

Quand j'appuie sur "Level=0", je peut faire une pause dans le PerlIDE.exe débogueur et de voir que la chaîne est divisé en Niveau 0 et inséré dans le tableau. Cependant, dès que le code des avances à l' if déclaration et les essais $pieces[0] eq "PromotionNumber" je reçois le message d'avertissement.

Je peux même imprimer $morceaux de[0] à droite avant le if déclaration, et il aura l'impression de "Niveau".

Si je change le code à la suite de l'avertissement disparaît...

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

Cependant, si je test pour le "Niveau" de la chaîne de seconde, l'alerte est de retour. Le code ci-dessous N'ont l'avertissement.

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

Pourquoi Perl soins qui commande, j'ai test? Note, que je suis en train de tester PLUSIEURS autres chaînes qui sont multiples elsif vers le bas dans mon if-else états qui ne respectent pas cet avertissement.

Des idées? J'ai vraiment besoin de cette alerte, afin de ne pas inonder la console lors de l'exécution. Le script fonctionne avec les mises en garde bien.

D'erreur Exact est:

Utilisation de la valeur non initialisée dans la chaîne de l'égaliseur à japdpmrijob.pl la ligne 250.

Ligne exacte de l'erreur (déterminée à l'aide de Perl utilitaire de débogage dans PerlIDE.exe) est:

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

Je peux imprimer $par morceaux sur[0] et de voir la valeur. Donc je sais qu'il est défini par ma valeur. Je peux également imprimer $morceaux[1] et de voir ma valeur attendue. Si je test pour la somme de pièces[0] eq "Niveau" d'abord, l'avertissement s'en va et je peux accéder à deux variables.

Je suis encore confus...

Il ressemble à l'erreur est en fait le "eq" être considéré comme une variable. Toutes les idées sur qui?

Ci-dessous vous trouverez une grande partie du code. J'ai inclus l'ensemble de la for boucle et plusieurs des variables qui je travaille. Avis de la else déclaration à la fin de l'if-else-le reste de la séquence, j'ai ajouté ceci pour tenter d'arrêter l'avertissement comme l'a noté la troisième réponse. Cette else déclaration imprime mes valeurs attendues à chaque fois que l'alerte est appelé, donc je sais que les valeurs sont présents.

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";
}
}
  • Presque certainement le problème est le $pieces[1] expression, pas $pieces[0]. Si vous avez une valeur de $var sans = (une ligne vide, par exemple) split retournera la liste d'un seul élément. Vos tests de "Type" et "Niveau" qu'à regarder le premier élément et le travail, mais le bloc sous "PromotionNumber" essaye de regarder le inexistants deuxième élément et génère le message d'avertissement.
  • Merci de poster l'erreur exacte que vous obtenez. Il n'est pas clair juste la ligne qui est à l'origine du problème.
  • Aussi, serait-il possible de nous montrer plus de code (au moins pour la boucle qui définit la valeur de $var). C'est un problème très étrange.
  • Je travaille pour obtenir le code sur mon ordinateur portable, mon serveur de test est d'avoir des problèmes avec ma clé usb et d'être un serveur de test, nous n'avons pas sur un réseau. Je vais mettre à jour dès que je reçois la clé USB fonctionne à nouveau.
  • le code a été ajouté.
InformationsquelleAutor Kyle | 2012-08-28