Valeur non initialisé non nulle [Résolu/Fermé]

Signaler
Messages postés
3
Date d'inscription
jeudi 16 mai 2013
Statut
Membre
Dernière intervention
13 juin 2013
-
Messages postés
5580
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 juin 2021
-
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



1 réponse

Messages postés
3
Date d'inscription
jeudi 16 mai 2013
Statut
Membre
Dernière intervention
13 juin 2013

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
Messages postés
5580
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 juin 2021
937
^(-?\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