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

Programmation et administration système Perl Discussion :

Use of uninitialized value in addition


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut Use of uninitialized value in addition
    Bonjour,

    J'ai un script qui fonctionne mais il a un message d'erreur que je ne comprend pas :
    Use of uninitialized value in addition (+) at ./test.pl line 44.

    Voici l'extrait avec la boucle qui contient la ligne 44 :
    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
     
    #!/usr/bin/perl
    use warnings;
    use strict;
    #temps local :
    (my $sec,my $min,my $hour,my $mday,my $mon,my $year,my $wday,my $yday,my $isdst) =localtime(time);
    $year += 1900;
    my $local_min=$hour*60+$min;
    print "local minutes : $local_min\n";
     
     
    ../...
     
    foreach my $check  (@command) {
                    if ($check =~ /start/) { 
                            my @check=split (/ /,$check);
                            my $hour_lic=$check[13];
                            #print "$hour_lic\n";
                            my @hour_lic=split(/:/,$hour);
                            chomp @hour_lic;
                            #print "$hour_lic[1] $hour_lic[2]\n"; 
                            my $minuts_lic=$hour_lic[0]*60+$hour_lic[1];
                            print "valeur des minutes occupation $minuts_lic \n"; 
                            my $time=$local_min-$minuts_lic;
                            if ( $time >= 15 ) {
                            print " La licence $feat est bloquee depuis plus de $time minutes\n"
                            }
                    }
    J'ai bien la valeurs $minuts_lic donc le calcul de la ligne 44 qui est : my $minuts_lic=$hour_lic[0]*60+$hour_lic[1]; fonctionne bien ............

    Faut-il charger un nouveau scalaire pour les 2 termes de l'addition??? Le soucis c'est que je n'ai pas de message d'erreur pour l'addition suivante :
    my $local_min=$hour*60+$min;
    Merci de votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Je pensais que de mettre de parenthèse avait résolu le problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $minuts_lic=($hour_lic[0]*60)+$hour_lic[1];
    Mais ce n'est pas le cas le message est toujours là ....
    ./test.pl
    Use of uninitialized value in addition (+) at ./test.pl line 44.
    valeur des minutes occupation 960
    La licence calinteractive est bloquee depuis plus de 48 minutes
    Use of uninitialized value in addition (+) at ./test.pl line 44.
    valeur des minutes occupation 960
    La licence calinteractive est bloquee depuis plus de 48 minutes

  3. #3
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour te répondre, il faudrait que tu pointes la ligne 44. Sache néanmoins que dans cette ligne, une des valeurs mise en jeu dans une addition numérique est "undef".
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #4
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value in addition (+) at ./test.pl line 44.
    Comme l'indique l'erreur, il y a une valeur non initialisée dans ton addition. Le fait d'avoir 960 comme résultat me fait dire qu'il s'agit de $hour_lic[1] puisque 960/60 = 16 tout pile, donc $hour_lic[0] renvoie 16 et $hour_lic[1] est vide. Que donne un print de ces 2 éléments ?
    Si c'est bien ca, il faut assigner une valeur à ton élément, pour l'initialiser et faire disparaitre le message d'erreur (pour pousser le bouchon on pourrait même dire que les éléments devraient faire l'objet d'un test afin de générer une erreur spécifique sur un problème de valorisation, mais ca c'est pour de la production )

    @+
    Mr6

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Philou la ligne 44 est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $minuts_lic=($hour_lic[0]*60)+$hour_lic[1];
    et pour répondre à Mr6

    Comment assigner un valeur $hour_lic[0] et $hour_lic[1] puisque ces scalaires sortent du tableau @hour_lic ?
    J'ai rajouté sans changement

    Merci de votre aide

  6. #6
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $hour_lic=0;
    my $min_lic=0;
    ($hour_lic, $min_lic) = split/:/,$hour;
     
    my $minuts_lic=($hour_lic*60)+$min_lic;
    Ca devrait le faire

    @+
    Mr6

  7. #7
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    A priori, ça ne devrait pas changé grand chose. Avant de faire le split de $hour, pourrais-tu l'afficher afin de vérifier s'il contient bien un ":" ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Bien sûr que ca change quelque chose, une variable à 0 ou à undef ce n'est tout de même pas pareil...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $hour_lic=$check[13];
                            #print "$hour_lic\n";
                            my @hour_lic=split(/:/,$hour);
    ya pas une coquille la ? ca serait pas $hour_lic à splitter à la place de $hour ?
    Ca expliquerait que le 2ème élément soit toujours vide... ($hour déclaré en début de script ne récupérant QUE l'heure...)

  9. #9
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Sauf que le split ré-affecte $min_lic à undef si $hour ne contient pas ":".
    Donc ça ne règle pas le problème si $hour ne respecte pas condition d'être formaté "\d+:\d+"
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Sauf que le split ré-affecte $min_lic à undef si $hour ne contient pas ":".
    Quel philou ce split ! Comme je sais ce que je lui donne à manger je n'avais jamais remarqué ce détail, je me le garde dans un coin de la tête, c'est assez cracra je trouve d'écraser une donnée avant même de savoir si on va lui mettre qqch à la place !

    Citation Envoyé par Philou67430 Voir le message
    Donc ça ne règle pas le problème si $hour ne respecte pas condition d'être formaté "\d+:\d+"
    Vu comme ca forcément je suis d'accord avec toi !
    Cela dit, quitte à vérifier le format de la donnée, autant tout faire d'un coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ($hour_lic =~ /(\d+):(\d+)/) {
       $minuts_lic = ($1*60)+$2;
    }
    else {
    die....
    }
    @+
    Mr6

  11. #11
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Tant qu'on en est à pinailler, allons-y (ne m'en veux pas, ça n'a rien de personnel).
    Citation Envoyé par Mr6 Voir le message
    Quel philou ce split ! Comme je sais ce que je lui donne à manger je n'avais jamais remarqué ce détail, je me le garde dans un coin de la tête, c'est assez cracra je trouve d'écraser une donnée avant même de savoir si on va lui mettre qqch à la place !
    Faux : ce n'est pas split qui affecte, c'est l'opérateur =
    Or, tu demandes à = d'affecter à 2 variables, une liste de valeurs (deux à priori).
    Vu comme ca forcément je suis d'accord avec toi !
    Cela dit, quitte à vérifier le format de la donnée, autant tout faire d'un coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ($hour_lic =~ /(\d+):(\d+)/) {
       $minuts_lic = ($1*60)+$2;
    }
    else {
    die....
    }
    @+
    Mr6
    Je préfère largement la version sans effet de bord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (my ($hour, $min) = $hour_lic =~ /(\d+):(\d+)/) {
       $minuts_lic = ($hour*60)+$min;
    }
    else {
      die....
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Tant qu'on en est à pinailler, allons-y (ne m'en veux pas, ça n'a rien de personnel).
    Au contraire, pinaillons ! Comment faire du code propre sinon ?


    Citation Envoyé par Philou67430 Voir le message
    Faux : ce n'est pas split qui affecte, c'est l'opérateur =
    Or, tu demandes à = d'affecter à 2 variables, une liste de valeurs (deux à priori).
    En fait je viens de faire un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $a='a';
    $b='b';
    ($a,$b) = ('xyz','');
    print "$a $b\n";
    ($a,$b) = ('xyz');
    print "$a $b\n";
    Je suis étonné de voir que $b ne génère pas de warning alors qu'il est forcé à vide avant le 1er print, et qu'il en génère un dans le 2ème... initialisation à vide et non-valorisation sont différents ???

    Citation Envoyé par Philou67430 Voir le message
    Je préfère largement la version sans effet de bord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (my ($hour, $min) = $hour_lic =~ /(\d+):(\d+)/) {
       $minuts_lic = ($hour*60)+$min;
    }
    else {
      die....
    }
    Ha ca.... j'ai du mal à prendre l'habitude, j'ai encore du chemin avant d'écrire propre

    @+
    Mr6

  13. #13
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Mr6 Voir le message
    En fait je viens de faire un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $a='a';
    $b='b';
    ($a,$b) = ('xyz','');
    print "$a $b\n";
    ($a,$b) = ('xyz');
    print "$a $b\n";
    Je suis étonné de voir que $b ne génère pas de warning alors qu'il est forcé à vide avant le 1er print, et qu'il en génère un dans le 2ème... initialisation à vide et non-valorisation sont différents ???
    Ah oui !!! c'est totalement différent.
    Une variable possède deux états : définie ou non définie.
    Une variable non définie ne possède qu'une valeur : undef
    Une variable définie possède une infinité de valeur possible selon son type (scalaire, array ou hash).

    L'opérateur // de perl 5.10 permet de bien distinguer la conversion logique d'une variable indéfinie de celle d'une variable définie et fausse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $a = ""; # défini la chaine vide
    $a = undef; # indéfini la variable
    if ($a) { # vrai si $a est indéfini ou si $a est faux
    ...
    }
    if (defined $a) { # vrai uniquement si $a est défini, qu'il soit vrai ou faux
      ...
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Effectivement il y avait une coquille mais cela n'empèchait pas le fonctionnement, et le message d'erreur reste bien qu'elle avait été corrigé.

    Merci Mr6

    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
    foreach my $check  (@command) {
                    if ($check =~ /start/) {
                            my @check=split (/ /,$check);
                            my $hour_lic=$check[13];
                            #print "$hour_lic\n";
                            my $hour_bis=0;
                            my $min_lic=0;
                            ($hour_bis, $min_lic) = split/:/,$hour_lic;
                            my $minuts_lic=($hour_bis*60)+$min_lic;
                            #print "valeur des minutes occupation $minuts_lic \n";
                            my $time=$local_min-$minuts_lic;
                            #print "$time\n";
                            if ( $time >= 15 ) {
                            print " La licence $feat est bloquee depuis plus de $time minutes\n"
                            }
                    }
    Cela fonctionne nickel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Use of uninitialized value in pattern match (m//)
    Par Vladkergan dans le forum Langage
    Réponses: 4
    Dernier message: 13/01/2008, 19h25
  2. Use of uninitialized value
    Par Djahny dans le forum Langage
    Réponses: 6
    Dernier message: 26/05/2007, 23h49
  3. 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
  4. [USE STRICT] uninitialized value in print ...
    Par pop_up dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2006, 14h18
  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