J'essaie de diviser une chaîne en utilisant la fonction split mais il n'y a pas toujours de valeur entre les tokens.Que retourne la fonction de partage Perl lorsqu'il n'y a pas de valeur entre les jetons?
Ex: ABC, 123 ,,,,,, XYZ
Je ne veux pas sauter les multiples jetons cependant. Ces valeurs sont dans des positions spécifiques dans la chaîne. Toutefois, lorsque je fais une division, puis que j'essaie de parcourir mon tableau résultant, j'obtiens des avertissements «Utilisation d'une valeur non initialisée». J'ai essayé de comparer la valeur en utilisant $splitvalues[x] eq ""
et j'ai essayé d'utiliser defined($splitvalues[x])
, mais je ne peux pas pour la vie de moi comprendre comment identifier ce que la fonction split est en train de mettre dans mon tableau quand il n'y a pas de valeur entre les jetons.
est ici l'extrait de mon code (maintenant avec bonté plus croquante):
my @matrixDetail =();
#some other processing happens here that is based on matching data from the
#@oldDetail array with the first field of the @matrixLine array. If it does
#match, then I do the split
if($IHaveAMatch)
{
@matrixDetail = split(',', $matrixLine[1]);
}
else
{
@matrixDetail = ('','','','','','','');
}
my $newDetailString =
(($matrixDetail[0] eq '') ? $oldDetail[0] : $matrixDetail[0])
. (($matrixDetail[1] eq '') ? $oldDetail[1] : $matrixDetail[1])
.
.
.
. (($matrixDetail[6] eq '') ? $oldDetail[6] : $matrixDetail[6]);
parce que c'est seulement des extraits, j'ai laissé une partie de l'autre logique, mais l'instruction if est à l'intérieur d'un sous cela retourne techniquement le tableau @matrixDetail. Si je ne trouve pas de correspondance dans ma matrice et que je mets le tableau à égalité avec le tableau de chaînes vides manuellement, je n'obtiens aucun avertissement. C'est seulement lorsque le split remplit le @matrixDetail.
Aussi, je devrais mentionner, j'ai écrit du code depuis près de 15 ans, mais seulement très récemment j'ai eu besoin de travailler avec Perl. La logique dans mon script est solide (ou du moins, ça marche), je suis juste en train d'être anal pour nettoyer mes avertissements et essayer de comprendre cette petite nuance.
@matrixDetail ou @oldDetail n'ont pas 7 éléments, ou @oldDetail a des éléments non définis. Déterminez lequel avec Data :: Dumper. Split renvoie des éléments définis si la chaîne d'origine est définie, c'est juste une question de nombre d'éléments. – runrig
un nombre incorrect d'éléments dans mes tableaux semble être un thème commun. Mais je sais que j'ai les bons chiffres. Comme je l'ai mentionné. Le script fonctionne, j'obtiens la sortie désirée que j'utilise le split ou non. Mais si j'utilise le split, et qu'il y a des champs vides dans la chaîne que je partage, alors je reçois des avertissements. Je veux résoudre les avertissements. – MitchelWB
Une chaîne vide ne vous donnera pas les avertissements de valeur non initialisée. Il y a quelque chose d'autre qui ne va pas dans votre programme et qui n'est pas lié à des chaînes vides ou aux valeurs renvoyées par 'split'. – CanSpice