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 :

Accés variable locale


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut Accés variable locale
    Salut à tous,

    comme d'hab je vous c/c le code et explique ensuite

    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
     
    package Service;
    use strict;
    use Utils;
    require Exporter;
    our @ISA = qw(Exporter);
    our @EXPORT = qw(sock_init);
     
    my %socket;
    my $CONNECT = 0;
     
    sub sock_init
    {
    	my $sock = IO::Socket::INET->new(PeerHost => getconf("ip"),
    	                                   PeerPort => getconf("port"),
    	                                   Proto => 'TCP');
     
    	die "Can't connect to server: $!" unless $sock;
    	$sock->autoflush(1);
        $socket{"id"} = $sock;
     
        # link to server
        &send("SERVER ".getconf("service")." ".getconf("pass")." 0 :".getconf("desc")."");
        &send("BURST");
        $CONNECT = 1;
     
        # bot creation
        &init_bot if $CONNECT;
     
        # listen and parse
        &parse_line($sock);
    }
     
    sub init_bot
    {
    	&send(":".getconf("service")." NICK ".time." ".getconf("nick")." ".getconf("host")." ".getconf("host")." ".getconf("ident")." ".getconf("modes")." 0.0.0.0 :".getconf("name")."");
    	&send(":".getconf("nick")." OPERTYPE Services");
    	&send(":".getconf("service")." FJOIN ".getconf("chan")." ".time()." :@,".getconf("nick")."");
    	&send("ENDOFBURST");
    }
     
    sub parse_line
    {
    	my $sock = shift;
     
    	while (defined(my $line = <$sock>))
    	{
    		chomp $line;
    		print "-> $line\n";
    	}
    }
     
    sub send
    {
    	my $line = shift;
    	my $send = "$line\r\n";
    	syswrite($socket{"id"}, $send, length($send));
    }
     
    1;
    Ce code est fonctionnel mais ca m'embete un peu de créer un hash %socket juste pour pouvoir reutiliser ce hash dans la fonction &send, voyez vous un autre moyen de procédé ?

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Passes $sock en paramètre à send() (et oui, les fonctions Perl peuvent avoir plus d'un paramètre... ). Par ailleurs, pourquoi utilises-tu & devant tous tes appels de fonctions ? C'est inutile et ça peut même te jouer de vilain tours (ça désactive la vérification de la signature, non que tu en ais souvent besoin mais bon...).

    --
    Jedaï

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    iop

    justement passer $sock dans send c'est ce que je ne veux surtout pas faire, la commande send va être utilisé dans plusieurs fichiers donc comment elle sera a quoi $sock correspond s'il n'est pas défini dans ce fichier, pour ce qui concernce les & je ne savais pas et je les ai donc tous retirés

    merci

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    encore moi

    en enlevent les & de devant ma fonction send il ne plus reconnaitre correctement ma fonction, j'ai cette erreur sur tout mes appel de send()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Not enough arguments for send at source/Service.pm line 44, near """)"

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est parce que tu as mal choisi le nom de ta fonction : send() est une fonction standard en Perl, avec un prototype incompatible avec ta fonction...

    --
    Jedaï

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    ok merci
    sinon pour mon 1er probleme aurais-tu une autre idée ?

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Ganondorf Voir le message
    iop

    justement passer $sock dans send c'est ce que je ne veux surtout pas faire, la commande send va être utilisé dans plusieurs fichiers donc comment elle sera a quoi $sock correspond s'il n'est pas défini dans ce fichier, pour ce qui concernce les & je ne savais pas et je les ai donc tous retirés

    merci
    Il te suffit de faire retourner $sock à ton init(). Mais je crois que je vois ton intention, tu veux cacher le $sock pour éviter que d'autres personnes essaye de l'utiliser directement au lieu d'utiliser ton send() (ou quel que soit son nouveau nom) qui fait les choses proprement ?
    Dans ce cas tu as plusieurs options :
    • La classique : tu fais de $sock une variable lexicale du package, personne ne pourra y toucher de l'extérieur mais toutes les fonctions de ton package pourront la manipuler. L'inconvénient étant que tu ne peux avoir qu'une seule instance de $sock, tu ne peux pas utiliser ton module pour contacter plusieurs serveurs simultanément.
    • L'objet. Sans doute l'idéal pour ton cas, bien qu'il te faille quelques connaissance en plus pour pouvoir créer ton module orienté objet, consulte la FAQ pour un début.


    --
    Jedaï

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    hi

    dans le cas d'une variable de package comment faire pour éviter une erreur du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Global symbol "$sock" requires explicit package name at source/Service.pm line 34.
    tout en gardant le pragma strict ?
    en tout cas il va falloir que je mette a la poo j'en aurai besoin dans un futur trés proche.

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il faut exporter la variable de package (créé avec our() ) en utilisant @EXPORT. Néanmoins si tu laisses vraiment $sock visible, je ne vois pas trop l'intérêt par rapport à une solution où init() renvoie un $sock que tu peux utiliser dans send_*() et compagnie.

    --
    Jedaï

Discussions similaires

  1. text, ntext et image sont interdits dans les variables locales
    Par Sebounet19 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/07/2013, 15h44
  2. [MFC] Globaliser une variable locale
    Par Philippe320 dans le forum MFC
    Réponses: 3
    Dernier message: 01/12/2005, 20h12
  3. Opendir + accès réseau local
    Par Lucier dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2005, 11h58
  4. variables locales ou globales?
    Par molesqualeux dans le forum C
    Réponses: 20
    Dernier message: 09/11/2005, 23h03
  5. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22

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