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 in division


Sujet :

Langage Perl

  1. #1
    Membre actif
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Par défaut [Résolu] Use of uninitialized value in division
    Bonjour a tous,

    J'ai un probleme (d'ou on poste ) avec perl . J'essai d'utiliser le module Statistics::RankCorrelation. Mais je suis bloquer, voici un exemple pour illustrer mon probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use Statistics::RankCorrelation;
     
    my $x = [ 0, 7, 6, 5, 4, 3, 2, 1 ];
    my $y = [ 2, 0, 5, 3, 4, 7, 8, 6 ];
     
    $c = Statistics::RankCorrelation->new( $ru, $ru2); # edition remplacement de $r par $ru et $ru2
     
    print $c->spearman."\n";
    print $c->kendall."\n";
    print $c->csim."\n";
    La tous va bien. mais tous ce complique dans l'exemple suivant.

    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
    use Statistics::RankCorrelation;
    my @ru=();
    my @ru2=();
     
    $ru[++$#ru]=18.2;
    $ru[++$#ru]=1.2;
    $ru[++$#ru]=15.2;
    $ru[++$#ru]=10.2;
    $ru[++$#ru]=1.2;
    $ru[++$#ru]=100.2;
     
    $ru2[++$#ru2]=128.2;
    $ru2[++$#ru2]=14.2;
    $ru2[++$#ru2]=153.2;
    $ru2[++$#ru2]=10.2;
    $ru2[++$#ru2]=19.2;
    $ru2[++$#ru2]=10.2;
     
    $c = Statistics::RankCorrelation->new( $ru, $ru2);
     
    print $c->spearman."\n";
    print $c->kendall."\n";
    print $c->csim."\n";
    J'obtiens ceux-ci comme erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Use of uninitialized value in division (/) at /opt/local/lib/perl5/site_perl/5.8.9/Statistics/RankCorrelation.pm line 110.
    Illegal division by zero at /opt/local/lib/perl5/site_perl/5.8.9/Statistics/RankCorrelation.pm line 110.

    La je comprend pas, est-ce un probleme d'initialisation de mes tableaux, ou la facon dont j'ajoute les données dans les tableaux?

  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
    Citation Envoyé par thibaultG Voir le message
    Bonjour a tous,

    J'ai un probleme (d'ou on poste ) avec perl . J'essai d'utiliser le module Statistics::RankCorrelation. Mais je suis bloquer, voici un exemple pour illustrer mon probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use Statistics::RankCorrelation;
     
    my $x = [ 0, 7, 6, 5, 4, 3, 2, 1 ];
    my $y = [ 2, 0, 5, 3, 4, 7, 8, 6 ];
     
    $c = Statistics::RankCorrelation->new( $r, $r);
     
    print $c->spearman."\n";
    print $c->kendall."\n";
    print $c->csim."\n";
    La tous va bien. mais tous ce complique dans l'exemple suivant.
    Ca m'étonnerait
    Tu déclares $x et $y, et tu utilises $r dans ton new, dont on ne voit aucune déclaration dans ton exemple.

    [CODE]
    $ru[++$#ru]=18.2;
    $ru[++$#ru]=1.2;
    $ru[++$#ru]=15.2;
    $ru[++$#ru]=15.2;
    $ru[++$#ru]=1.2;
    $ru[++$#ru]=100.2;

    $ru2[++$#ru2]=128.2;
    $ru2[++$#ru2]=14.2;
    $ru2[++$#ru2]=153.2;
    $ru2[++$#ru2]=10.2;
    $ru2[++$#ru2]=19.2;
    $ru2[++$#ru2]=10.2;
    Drôle de manière d'ajouter des éléments dans une liste.
    1- pourquoi ne pas avoir simplement déclaré les tableaux comme dans l'exemple précédent (définition d'une référence à un tableau anonyme) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ru = [ 18.2, 1.2, 15.2, 15.2, 1.2, 100.2 ]; # reference à tableau anonyme
    @ru = (18.2, 1.2, 15.2, 15.2, 1.2, 100.2); # même chose mais pour un tableau
    ...
    2- Si tu souhaites ajouter un éléments à la fois dans le tableau @ru, pourquoi ne pas simplement utiliser push ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    push @ru, 18.2;
    push @ru, 1.2;
    ...
    $c = Statistics::RankCorrelation->new( $ru, $ru2);

    ...

    La je comprend pas, est-ce un probleme d'initialisation de mes tableaux, ou la facon dont j'ajoute les données dans les tableaux?
    Oui, c'est un problème de déclaration (ou d'usage de la fonction new). La fonction new accepte des références à des tableaux. Or toi, tu définis des tableaux (@ru et @ru2) et tu passes en paramètres des scalaires ($ru, $ru2) que tu n'as par ailleurs pas définis.
    Il aurait fallu, soit définir des références à des tableaux anonymes $ru et $ru2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $ru;
    push @$ru, 15.2;
    ...
    $c = Statistics::RankCorrelation->new( $ru, $ru2);
    ou définir des tableaux @ru et @ru2 et passer en paramètre leur référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my @ru;
    push @ru, 15.2;
    ...
    $c = Statistics::RankCorrelation->new( \@ru, \@u2);

  3. #3
    Membre actif
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Ca m'étonnerait
    Tu déclares $x et $y, et tu utilises $r dans ton new, dont on ne voit aucune déclaration dans ton exemple.[/code]
    LOL Une petite erreur comme tu t'en douté.


    Pour push je connaissais, mais cette autre methode d'ajout etait une tentative desesperé .

    Ce qui j'ignorais c’était la différence entre l'initialisation d'un tableau avec $ et @ Un grand merci n’étant pas habitué a programmer en perl cette difference m'était inconnu.

  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
    En fait, les variables dont le nom commencent par un sigil @ dont des tableaux. Un tableau ne peut contenir QUE des scalaires (c'est à dire des variables dont le nom commence par un sigil $ ; c'est variable ne contiennent qu'une valeur, à l'opposé des tableaux et des tables de hashages qui en contiennent plusieurs).

    Mais il existe une méthode des scalaires spéciaux que l'on appelle des références (dans les langages plus classiques comme C, on parlerait de pointeurs), qui peuvent pointer vers (référencer) une table de hashage ou un tableau (voire d'autres objets comme des fonctions, des handles, des objets consacrés par bless, ...). Bref, il est ainsi possible d'imbriquer plusieurs tableaux les uns dans les autres par le biais de références.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $tableau = [ 0, 1, 1, 2, 3, 5, 8 ]; # Note la différence [ ] au lieu de ( )
    $hashage = { fibo1 => 0, fibo2 => 1, fibo3 => 1, fibo4 => 2 }; # Note la différence { } au lieu de ( )
    Une particularité de perl et de définir des objets anonymes (c'est à dire, qu'ils ne sont pas rattachés à un symbole). On peut ainsi créer des tableaux anonymes ou des tables de hashage anonymes (on peut aussi créer des fonctions anonymes : on les appelle alors de closure, fermetures en français). Au lieu d'affecter ces objets anonymes à des variables tableaux et tables de hashage, on n'en récupère la référence que l'on peut alors affecter à un scalaire. C'est ainsi qu'à l'aide de tables de hashage, il est possible d'émuler des structures de données, type de donnée qui n'existe pas nativement dans perl (et donc on n'a pas besoin à vrai dire). Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @liste_eleve = (
      { nom => "Lupin", prenom => "Arsene", classe => "2A" },
      { nom => "Steed", prenom => "John", classe => "1S" },
    );
    La grosse différence entre le tableau (variables @) et la référence à un tableau ($) est dans l'utilisation. Dans le premier cas, il suffit d'utiliser le tableau directement, alors qu'avec la référence, il faut d'aborder déréférencer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $eleve (@liste_eleve) { 
    ...
    }
    mais si l'on avait défini la liste d'élève par une référence à un tableau anonyme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $liste_eleve = [
      { nom => "Lupin", prenom => "Arsene", classe => "2A" },
      { nom => "Steed", prenom => "John", classe => "1S" },
    ];
     
    foreach my $eleve (@$liste_eleve) { 
    ...
    }
    En espérant avoir été suffisamment complet et clair.

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, 20h25
  2. Use of uninitialized value
    Par Djahny dans le forum Langage
    Réponses: 6
    Dernier message: 27/05/2007, 00h49
  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, 14h49
  4. [USE STRICT] uninitialized value in print ...
    Par pop_up dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2006, 15h18
  5. [langage] Use of uninitialized value
    Par Batou dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2005, 11h28

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