IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Use of uninitialized value $valhier in string at


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut Use of uninitialized value $valhier in string at
    Bonjour,

    Je débute en Perl, et je voulais faire un petit script pour me générer un fichier.
    J'ai l'erreur suivante à l'execution : Use of uninitialized value $valhier in string at line (voir ligne correspondante en gras)

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    my $i = 0;
    my $tab_auj;
    my $tab_hier;
    my $time;
    my $val;
    my $valhier;
    my $fileCSV;
    my @tab_auj= ();
    my @tab_hier= ();
    my @result= ();
    
    
    # Run the main loop
    &genere;
    
    # ========== generer fichier xml pour datas temperature THGN800 ===============
    sub genere {
    	
    # Requete pour les résultats du jour
    	my $requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -25 HOUR) AND NOW() ORDER BY timestamp_mesure DESC";
    	my $sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_auj[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
    	
    	
    # Requete pour les résultats de la veille
    
    	$requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -50 HOUR) AND DATE_ADD(NOW(),INTERVAL -25 HOUR) ORDER BY timestamp_mesure DESC";
    	$sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_hier[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
    	
    	use FileHandle;
    
    	my $fileXML="/volume1/web/meteo/graph_THGN800_1_temp/datas.XML";
    	open (F, ">$fileXML");
    	print F "chart_data: ";#pour écrire dans le fichier
    
    
    	for $i (0 .. ($#tab_auj)) {
    			$time = $tab_auj[$i]->{timestamp_mesure};
    			$val = $tab_auj[$i]->{valeur_mesure};
    			$valhier = $tab_hier[$i]->{valeur_mesure};
    			print F "$time";
    			print F ";";
    			print F "$val";
    			print F ";";
    			print F "$valhier";
    			print F ";";
    	}
    	
    	print F ",\n";
    
    	close F;#fermeture du fichier.
    
    print "Fin du script\n\n";
    }
    J'ai déclaré et initialisé mes variables. J'ai beau chercher, je ne trouve pas.
    Merci pour votre aide.
    Mikael

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Avant de regarder plus loin, merci d'ajouter en début de script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;
    Si tu souhaites encore de l'aide, il faudra fournir le contenu du fichier /volume1/web/meteo/graph_THGN800_1_temp/datas.XML

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut
    Effectivement je n'avais pas mis le début du fichier dans mon quote.

    Je remet le fichier complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #!/opt/bin/perl -w
     eval 'exec /opt/bin/perl -w -S $0 ${1+"$@"}'
         if 0; # not running under some shell
     
    =head1 NAME
     
     genere_xml_meteo - Perl script to generate xml datas files for website charts
     
     
    =head1 DESCRIPTION
     
    Perl script to generate xml datas files for website charts
     
    =cut
    use strict;
    use warnings;
     
    use DBI;
    my $DB = "xxxx";
    my $HOST = "xxxx";
    my $LOGIN = "xxxx";
    my $PWD = "xxxx";
    my $dbh = DBI->connect("dbi:mysql:dbname=$DB;host=$HOST;",$LOGIN,$PWD) or die "Connexion impossible\n";
    $|=1; # autoflush helps debugging
     
    my $i = 0;
    my $tab_auj;
    my $tab_hier;
    my $time;
    my $val;
    my $valhier;
    my $fileCSV;
    my @tab_auj= ();
    my @tab_hier= ();
    my @result= ();
     
     
    # Run the main loop
    &genere;
     
    # ========== generer fichier xml pour datas temperature THGN800 ===============
    sub genere {
     
    # Requete pour les résultats du jour
    	my $requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -25 HOUR) AND NOW() ORDER BY timestamp_mesure DESC";
    	my $sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_auj[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
     
     
    # Requete pour les résultats de la veille
     
    	$requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -50 HOUR) AND DATE_ADD(NOW(),INTERVAL -25 HOUR) ORDER BY timestamp_mesure DESC";
    	$sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_hier[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
     
    	use FileHandle;
     
    	my $fileXML="/volume1/web/meteo/graph_THGN800_1_temp/datas.XML";
    	open (F, ">$fileXML");
    	print F "chart_data: ";#pour écrire dans le fichier
     
     
    	for $i (0 .. ($#tab_auj)) {
    			$time = $tab_auj[$i]->{timestamp_mesure};
    			$val = $tab_auj[$i]->{valeur_mesure};
    			$valhier = $tab_hier[$i]->{valeur_mesure};
    			print F "$time";
    			print F ";";
    			print F "$val";
    			print F ";";
    			print F "$valhier";
    			print F ";";
    	}
     
    	print F ",\n";
     
    	close F;#fermeture du fichier.
     
    print "Fin du script\n\n";
    }
    Concernant le fichier XML : /volume1/web/meteo/graph_THGN800_1_temp/datas.XML. C'est un fichier qui est vide, ou qui n'existe pas, et que ce script génère.
    L'interet de ce script est de generer un fichier de données, qui sera sans doute du csv par la suite (mais seule l'extension sera à changer). Les datas contenue dans ce fichier seront extraites de ma BDD.

    Merci.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Ahem, ok, j'ai lu un peu rapidement.

    Cela dit, je ne pense pas que la ligne avec l'erreur soit celle en gras, mais plutôt celle-ci :
    $valhier est initialisé à partir du tableau @tab_hier. Ce tableau est initialisé à partir de la requète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -50 HOUR) AND DATE_ADD(NOW(),INTERVAL -25 HOUR) ORDER BY timestamp_mesure DESC";
    Avez-vous vérifié que cette requète retourne autant d'éléments que la requète qui rempli @tab_auj ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut
    Merci pour la réponse,

    La ligne d'erreur correspond bien à celle que tu dis.

    Effectivement, il est sur qu'il n'y a pas le même nombre d'enregistrements retournés pour les deux mêmes requêtes.
    A raison de 1 enregistrement tous les 1/4h, si je mets dans mes deux requetes un DESC LIMIT 96, cela fonctionnera ?
    Le problème est du au nombre d'enregistrements qui n'est pas identique ?

    J'ai testé avec le DESC LIMIT 96, erreur idem :
    Use of uninitialized value $valhier in string at /opt/bin/genere_xml_mete line 82.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Je ne comprends pas ce que fais ton script (et je ne chercher pas à le faire), mais je constate simplement que dans ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for $i (0 .. ($#tab_auj)) {
    ton indice $i varie de 0 jusqu'au dernier élément du tableau @tab_auj
    et tu utilises ce même indice pour deréférencer le tableau @tab_hier.

    Il suffit donc que le tableau @tab_hier ne contiennent pas le même nombre d'élément que le tableau @tab_auj pour que le bug apparaisse (l'erreur d'initialisation).
    Cela dit, même si les tableaux sont de même taille, il reste que les données des deux tableaux doivent être "cohérentes entre elles pour l'usage que tu veux en faire", et ça, pour chaque valeur de l'indice $i.

Discussions similaires

  1. Use of uninitialized value in string
    Par lokomass dans le forum Programmation et administration système
    Réponses: 10
    Dernier message: 25/04/2013, 15h19
  2. Use of uninitialized value in concatenation (.) or string
    Par pontarose dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2011, 13h26
  3. Use of uninitialized value $code_retour in string ne at
    Par cbassti1 dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2010, 22h16
  4. Use of uninitialized value in string ne at
    Par Gad29 dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 09/05/2007, 13h49
  5. [langage] Use of uninitialized value
    Par Batou dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2005, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo