Valeur non initialisé non nulle

Résolu/Fermé
Nirdaven Messages postés 3 Date d'inscription jeudi 16 mai 2013 Statut Membre Dernière intervention 13 juin 2013 - 16 mai 2013 à 15:37
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 21 mai 2013 à 19:33
Salutation tous le monde,

Je m'adresse à vous car j'ai un problème dans un script et je ne comprend pas d'où il vient...
Je m'explique en vous montrant une partie du programme :

@fic=<FILE>;
$taille=@fic;
foreach (@fic)
{	
	if ( $l >= (8+$nbparam) && $l < $taille )
	{
		$save=$_;
		chomp ($save);
		$save=~tr/./,/;
		$i=0;
		while ( defined($save) == 1 )
		{
			($j,$save)=($save =~ /^(-?\d*,*\d*);(.*)/);#   <--- valeur de $j ?
			if ( !$j )
			{
				$j=999999;
				$hash->{$k}->{$i}=$j;
			}
			else
			{
				print "$j\n";#                        <---- Vérification
				$j=~tr/,/./;
				$hash->{$k}->{$i}=$j;
			}
			$i++;
		}
		$k++;
	}
	$l++;
}


Je passe en entré un fichier .csv de la forme suivante :
25.0;70;123;52;;
999;18;82;5;;
...

et lorsque je lance mon programme, il ne me trouve pas d'erreur, mais je n'ai jamais la valeur 999999 à la place des "trou"/valeurs manquantes. J'ai essayé de remplacer if ( !$j ) (je suis sur et certain que l'erreur vient de la) par
- $j eq undef
- !defined($j)
- $j eq ""
- $j eq ''
mais rien ne marche alors que le print de vérification affiche bien rien a l'écran...
Auriez vous des idées pour récupérer les valeurs et mettre un chiffre exorbitant à la place des trous?

Merci d'avance de vos réponses

Nirdaven



A voir également:

1 réponse

Nirdaven Messages postés 3 Date d'inscription jeudi 16 mai 2013 Statut Membre Dernière intervention 13 juin 2013
17 mai 2013 à 15:48
merci de vos réponses -_-'
je me suis débrouillé avec un split et une boucle qui vérifie qu'il n'y ai pas valeur "" dans les cases du tableau donné par le split
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
21 mai 2013 à 19:33
^(-?\d*,*\d*);(.*)

va matcher :

- à partir du début de la ligne
- une ligne commençant par un seul tiret, ou ne commençant pas par un tiret
- suivie d'un chiffre, ou de plusieurs chiffres à la suite, ou de zéro chiffres
- suivi d'une virgule, de plusieurs virgules à la suite, ou d'aucune virgule
- suivie d'un chiffre, ou de plusieurs chiffres à la suite, ou de zéro chiffres
- suivi d'un point-virgule
- suivi de n'importe quels caractères, ou de rien du tout

Donc, pour "999;18;82;5;;" ta regexp va matcher "999" sur la première parenthèse, et "18;82;5;;" sur la deuxième.

Si, en fait, ce que tu veux vérifier et capturer, c'est le dernier champ parmi les 5 champs terminés par un point-virgule (cela semble être le cas d'après ta réponse à ton propre message, mais ce n'est pas clair dans ce que tu dis dans ton message d'origine), je pense que ta regexp est fausse.

Une regexp adéquate pourrait être la suivante, avec prise en compte du cas où ce champ est vide :

#!/usr/bin/perl

use strict;
use warnings;

$_ = "999;18;82;5;;";
my $j;

/^([^;]*;[^;]*;[^;]*;[^;]*);([^;]*);/;

if ($2 eq "")
{
  $j = "999999";
} else
{
  $j = $2;
}

print "Partie 1 = $1 / Partie 2 = $j\n";

Dal
0