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 :

Objet et valeur 0


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut Objet et valeur 0
    Bonjour les développeurs,

    Voilà, j'ai un petit soucis, certainement une étourderie, mais ça bloque l'avancée de mon programme depuis un petit moment.

    J'ai créé cet objet :

    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
    sub new {
    	my ( $classe, $nom, $deb, $fin, $long, $id, $met, $compl, $fs ) = @_;
     
    	# Vérifions la classe
    	$classe = ref($classe) || $classe or die "erreur1";
     
    	# Création de la référence anonyme d'un hachage vide (futur objet)
    	my $this = {} or die "erreur2";
     
    	# Liaison de l'objet à la classe
     
     
    	$this->{NOM_GENE}		=	$nom or die "erreur4";
    	$this->{DEBUT_ALIGN}		=	$deb or die "erreur5";
    	$this->{FIN_ALIGN}		=	$fin or die "erreur6";
    	$this->{LONGUEUR_ALIGN}		=	$long or die "erreur7";
    	$this->{POURCENT_IDENTITE}	=	$id or die "erreur8";
    	$this->{PRESENCE_MET}		=	$met or die "erreur9";
    	$this->{SEQ_REF_COMPLETE}	=	$compl or die "erreur10";
    	$this->{FRAMESHIFT}		=	$fs or die "erreur11";
     
    	print $this->{NOM_GENE} or die "erreur12";
     
    	bless( $this, $classe ) or die "erreur3";
    	return $this or die "erreur13";
    }

    Lorsque dans mon programme principal je tente de le remplir, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $info_hit[$hsp_val] = InfoHit->new($nom, $deb, $fin, $long, $id, $met, $compl, $fs);
    ici, $nom/$compl sont des chaines de caractères, les autres des valeurs numériques. Il se trouve que $met et $fs = 0. Or, c'est deux valeurs où lors de l'affectation, un die est retourné. J'ai essayé en changeant les valeurs ($met = 1), et là... ça marche :/.

    Je ne comprend pas pourquoi mon objet n'accepte pas l'affectation de valeur nulle (enfin, non, de 0)...


    Merci d'avance de vous intéresser à mon soucis !

    Bonne journée.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    tu as un souci de conception. Il faut arrêter les or die un peu n'importe où et surtout mal écrit.

    De plus, en Perl, quand une procédure ou une méthode a plus de 3 arguments, il est conseillé d'utiliser un hash. De ce fait, ton code réécrit ressemblerait à celui-ci :

    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
    sub new {
      my ( $classe, %parametres ) = @_;
     
      # Vérifions la classe
      $classe = ref($classe) || $classe;
     
      # Création de la référence anonyme d'un hachage vide (futur objet)
      my $this = {};
     
      # Vérification des paramètres
      foreach my $nom_champ (qw /nom debut fin longueur id met compl frameshift/) {
        if ( not exists $parametres{$nom_champ} ) {
          die "Parametre $nom_champ inexistant\n";
        }
      }
     
      $this->{NOM_GENE}          = $parametres{nom};
      $this->{DEBUT_ALIGN}       = $parametres{debut};
      $this->{FIN_ALIGN}         = $parametres{fin};
      $this->{LONGUEUR_ALIGN}    = $parametres{longueur};
      $this->{POURCENT_IDENTITE} = $parametres{id};
      $this->{PRESENCE_MET}      = $parametres{met};
      $this->{SEQ_REF_COMPLETE}  = $parametres{compl};
      $this->{FRAMESHIFT}        = $parametres{frameshift};
     
      bless $this, $classe;
      return $this;
    }
    Et dans ton code principal, tu appellerais ton module via ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $info_hit[$hsp_val] = InfoHit->new(
      nom        => $nom,
      debut      => $deb,
      fin        => $fin,
      longueur   => $long,
      id         => $id,
      met        => $met,
      compl      => $compl,
      frameshift => $fs,
    );
    C'est quand même plus lisible, propre car on ne se demande plus en quelle position dois-je mettre l'id, le debut, fin...

  3. #3
    Membre averti
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut
    Merci beaucoup Djibril.

    En fait, j'avais commencé par un objet en hash comme tu viens de faire à une ou deux nuances près. Et il ne marchait pas. Mais en voyant ces "une ou deux nuances", je vois où est mon précédent soucis .

    Pour les or die, c'était juste pour le test, pour trouver quelle ligne ne fonctionnait pas.


    Merci beaucoup, en tout cas, je vais aller essayer ça dessuite!

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

Discussions similaires

  1. Envoyer des objets par valeur
    Par Promeneur dans le forum Windows Communication Foundation
    Réponses: 7
    Dernier message: 28/03/2008, 17h45
  2. Copier un objet par valeur ?
    Par Totanne dans le forum VB.NET
    Réponses: 4
    Dernier message: 25/03/2008, 14h22
  3. Réponses: 5
    Dernier message: 27/10/2007, 10h11
  4. [POO] Objet par valeur
    Par seb34 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2006, 22h49
  5. [debutant][erreur] pas un Objet ou valeur Null
    Par Tempotpo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/04/2006, 16h17

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