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 :

Comment passer une classe en parametre ?


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Comment passer une classe en parametre ?
    Bonjour,

    Voila, je suis débutant en PERL. Je viens de créer mon premier petit robot qui se connecte à une base de donnée pour faire des tests ping sur plusieurs serveurs.
    Je souhaiterais me faire un package "ConfigAppli" pour que toutes les variables de configurations soient modifiable.

    Le problème c'est que quand je passe en parametre ma connexion à la base de données, impossible d'executer ...

    Ma question est simple : Il y a t il un moyen pour se connecter une seul fois a la base de données et pouvoir acceder au connecteur de partout en PERL ? Si non, qu'elle est la méthode la plus simple ?

    Actuellement quand j'execute le script, voici le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't use string ("1") as a HASH ref while "strict refs" in use at /etc/########/Class/ConfigAppli.pm line 25.
    Mon script principale :

    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
    #!/usr/bin/perl
     
    use warnings;
    use DBI;
    use Net::Ping;
    use MIME::Lite;
    use Data::Dumper;
     
    use lib '/etc/########/Class';
    use ConfigAppli;
     
    my $database	= "#############";
    my $hostname	= "#############";
    my $login 		= "#############";
    my $mdp 		= "#############";
     
    my $dbh = DBI->connect( "DBI:mysql:database=$database;host=$hostname", $login, $mdp ) 
    	or die "Echec connexion";
     
    my $Config = ConfigAppli->new( $dbh );
    $Config->load();
     
    print Dumper $Config;
    Et voici ma class :

    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
    package ConfigAppli;
     
    use warnings;
    use strict;
     
    	sub new {
    		my ( $classe, $dbh ) = @_;
    		my $this = {
    			"dbh" => $dbh	
    		};
     
    		$this->{interval}	= 1;	# Temps d'attente (en minute)
    		$this->{avertNeg}	= 3;	# Nombre de test ping pour déclencher un avertissement
    		$this->{maxNeg}		= 8;	# Nombre de test ping pour déclencher une alerte
    		$this->{To}			= "";	# Mail pour l'envoie des alertes
    		$this->{Cc}			= "";	# Personne en copie des mails d'alertes
     
    		bless( $this, $classe );
    		return $this;
    	}
     
    	sub load {
    		my $this = @_;
     
    		my $prep = $this->{dbh}->prepare("SELECT * FROM configurationAppli;") 
    					or die $this->{dbh}->errstr;
    		$prep->execute() 
    					or die "Echec requête\n";
    		my $Config = $prep->fetchrow_hashref ;
     
    		print $Config->{To} ;
    		print "\n" ;
    		print $Config->{Cc} ;
    		print "\n" ;
     
    		$this->{interval}	= $Config->{interval};
    		$this->{avertNeg}	= $Config->{avertNeg};
    		$this->{maxNeg}		= $Config->{maxNeg};
    		$this->{To}			= $Config->{To};
    		$this->{Cc}			= $Config->{Cc};
     
    		$prep->finish();
    	}
     
    	sub getInterval {
    		my $this = shift;
    		return $this->{interval} ;
    	}
     
    	sub getAvertNeg {
    		my $this = shift;
    		return $this->{avertNeg} ;
    	}
     
    	sub getAlerteNeg {
    		my $this = shift;
    		return $this->{maxNeg} ;
    	}
     
    	sub getMailTo {
    		my $this = shift;
    		return $this->{To} ;
    	}
     
    	sub getMailCc {
    		my $this = shift;
    		return $this->{Cc} ;
    	}
     
    1;
    Merci d'avance pour votre aide.

  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 : 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
    Ceci est peut-être du à cette erreur "de débutant" (ce n'est pas péjoratif) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	sub load {
    		my $this = @_;
    En perl, il faut savoir que même s'il n'existe pas de typage fort, il existe un typage faible : une référence peut être scalaire ou tableau (ou liste).
    En fonction de ce type, les opérateurs et fonctions peuvent avoir un comportement contextuel différent.

    Dans cette ligne :
    $this est un scalaire, et tu souhaites l'affecter avec @_, qui lui est un tableau. Dans cette expression d'affectation, perl va forcer l'opérande de droite (@_) au contexte de l'opérande de gauche (à savoir, un scalaire). Ta ligne est donc équivalente à :
    Or, un tableau forcé à un contexte de scalaire retourne la taille du tableau (d'où le "Can't use string ("1") as a HASH ref", puisque tu n'as passé qu'un paramètre).
    Pour affecter $this correctement, il existe deux méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $this = shift; # (implicitement, il s'agit de shift @_)
    Dans ce cas, on dépile de @_ la première valeur (et @_ devient vide s'il ne contenait qu'un seul paramètre).
    Ou alors, ce qui est souvent plus pratique, notamment s'il y a plusieurs paramètres à passer :
    Ici, on force l'opérande de gauche à être évalué dans un contexte de tableau. Les éléments du tableau de droite (@_) sont donc affectés un à un aux éléments du tableau de gauche ( ($this) ), et les éléments superflus sont laissés de coté.

    Pour ma part, lorsqu'il s'agit de méthode de classe, j'utilise toujours shift pour dépiler "this" (ou self), et l'affectation de tableau pour le reste des paramètres. Ceci permet d'identifier clairement l'objet manipulé des paramètres de la méthode (ce qui, dans les autres langages objets est implicite).
    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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Merci pour ce petit cours de PERL , c'est toujours bon a prendre ^^

    Pour le bug de mon script, c'est bon, c'est corrigé!

    Merci encore !

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

Discussions similaires

  1. passer une classe comme parametre d'une fonction
    Par antoine dpt dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/07/2009, 13h10
  2. comment passer une url en parametre?
    Par bylka dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 19/01/2009, 11h55
  3. Réponses: 7
    Dernier message: 03/03/2008, 11h17
  4. Passer une classe en parametre
    Par kitiara999 dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2006, 14h06
  5. Passer une séquence en parametre
    Par djousss dans le forum CORBA
    Réponses: 2
    Dernier message: 02/12/2003, 22h39

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