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

Modules Perl Discussion :

Classe et objet + Modules standards


Sujet :

Modules Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Par défaut Classe et objet + Modules standards
    Bonjour,

    J'explique mon problème.

    J'ai créé une classe :
    package test;

    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 LWP;
    $objet = test->new("http://google.fr");
     
    package test;
    sub new {
    $class = shift;
    $url = @_;
    $self = {};
    $self->{UA} = LWP::UserAgent->new(
    agent => "test/1.0",timeout => 30);
    $self->{URL} = $url;
    bless($self);
    return $self;
    }
    sub test {
    $ua = $self->{UA};
    $req = HTTP::Request->new(GET => "$self->{URL}");
    $res = $ua->request($req);
    print $res;
    }
     
    1;

    Mais ce code ne fonctionne pas à cause de

    * LWP::UserAgent->new(

    * $res = $ua->request($req);


    Pourquoi ? Ne peut-on pas utiliser des modules à l'intérieur d'une classe que l'on crée ? Y a il une synthaxe que je ne connais pas ?

    Merci pour votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    à priori le probleme à de fortes chances de venir de l'absence d'un "package main;" en haut de ton code.
    et aussi tu ne fait pas de use des modules que tu utilise (LWP et HTTP::Request) au bon endroit

    En regles generale on prefere mettre le module à part du script (chaque module==un fichier .pm et le script à part en .pl).

    On prefere egalement que la premiere lettre du nom du module soit en majuscule, et il faut que le nom soit exactement le meme que le nom+chemin du fichier, y compris au niveau de la casse.

    ensuite dans ton new il faut que tu utilise la version deux argument de bless (je ne sais pas ou tu a vu cette frome à un seul argument, mais si c'est dans tutorial je te conseil d'en changer car elle est fortement deconseillée).

    bless $self equivaut à bless $self, __PACKAGE__ et interdit donc l'heritage de ta classe.

    utilise plutot bless $self, $class;

    autre chose egalement, si tu fait cela:
    $url = @_;

    alors tu evalue un array (@_) en contexte scalair ($url) et donc ce que tu va recuperer dans $url c'est le nombre d'elements de @_.

    ce que tu veux c'est ca:

    ($url) = @_;

    et meme plutot
    my ($url) = @_;

    utilise use strict et use warnings partout !

    et soigne ton indentation aussi

    et dans ta sub test il faut aussi que tu recupere $self en premier argument (il est automatiquement passé à ta sub à l'appel de la methode)

    En gros voila ce que donnerais ton module+script :

    ton module Test.pm (dans le meme rep que le script)
    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
    package Test;
    use strict;
    use warnings;
    use LWP::UserAgent;
    use HTTP::Request;
     
    sub new {
    	my $class = shift;
    	my ($url) = @_;
    	$self = {};
    	$self->{UA} = LWP::UserAgent->new(
    		agent	=> "test/1.0",
    		timeout	=> 30,
    	);
    	$self->{URL} = $url;
    	return bless $self, $class;
    }
     
    sub test {
    	my $self = shift;
    	my $ua = $self->{UA};
    	my $req = HTTP::Request->new(GET => $self->{URL});
    	my $res = $ua->request($req);
    	print $res->content;
    }
     
    1;
    ton script .pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use strict;
    use warnings;
    use Test;
     
    my $objet = Test->new("http://google.fr") or die;
    $object->test;

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Par défaut
    Merci pour ton aide et tes détails precieux !
    En effet mon problème venait de return bless $self, $class;

    Aurais tu des liens, documents sur la programmation orienté objet en Perl à me conseiller ? (a part la faq)

    Merci encore !

Discussions similaires

  1. Objets "module de classe" passé en paramètre de fonction
    Par jeanjean6 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 19/03/2013, 09h49
  2. [Débutant] Remplacer modules standards par modules de classe
    Par AlainTech dans le forum VB.NET
    Réponses: 6
    Dernier message: 25/11/2012, 09h25
  3. [XL-2000] Objets, modules de classe, méthodes
    Par crashtib dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/02/2010, 18h04
  4. Quel est La difference Entre Module Standard Et Module Classe
    Par r.mehdi dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/06/2008, 12h39
  5. Classes et objets...
    Par cyrpaut dans le forum Général Python
    Réponses: 2
    Dernier message: 20/11/2005, 20h48

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