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

  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ï

  10. #10
    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
    bon j'ai reussi

    fichier principal:

    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 strict;
    use IO::Socket;
    use Getopt::Std;
     
    # inspuworld modules directory
    use lib 'source';
    use Utils;
    use Service;
     
    # check options
    my %options;
    getopts('d',\%options) or help;
    if (defined($options{"d"})) { print "Fork this shit\n"; }
    undef %options;
     
    # loading configuration & users access
    load_config;
    load_access;
     
    # creating socket,connect it to irc & listen
    our $socket = init_sock;
    init_service;
    package Service:

    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
     
    package Service;
    use strict;
    use Utils;
    require Exporter;
    our @ISA = qw(Exporter);
    our @EXPORT = qw(init_sock init_service);
     
    my $NOFORK = 1;
     
    sub init_sock
    {
    	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);
    	return $sock;
    }
     
    sub init_service
    {
        # link to server & listen sock
        senddata("SERVER ".getconf("service")." ".getconf("pass")." 0 :".getconf("desc")."");
        senddata("BURST");
    	senddata(":".getconf("service")." NICK ".time." ".getconf("nick")." ".getconf("host")." ".getconf("host")." ".getconf("ident")." ".getconf("modes")." 0.0.0.0 :".getconf("name")."");
    	senddata(":".getconf("nick")." OPERTYPE Services");
    	senddata(":".getconf("service")." FJOIN ".getconf("chan")." ".time()." :@,".getconf("nick")."");
    	senddata("ENDOFBURST");
        parse_line();
    }
     
    sub parse_line
    {
    	while (defined(my $line = <$main::socket>))
    	{
    		chomp $line;
    		print "Received: $line\n" if $NOFORK;
     
    		# Ping reply
    		if ($line =~ /^:(.+?)\sPING\s.+?$/)
    		{
    			senddata(":".getconf("service")." PONG $1");
    		}
    	}
    }
     
    sub senddata
    {
    	my $line = shift;
    	my $send = "$line\r\n";
    	syswrite($main::socket, $send, length($send));
    	print "Sent: $line\n" if $NOFORK;
    }
     
    1;
    si ma merde peut aider quelqu'un c'est toujours ca ...

  11. #11
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    syswrite($main::socket, $send, length($send));
    Non !! Ca c'est horrible...
    Je préfère encore la solution avec une variable de package dans Services...
    Est-ce que tu te rend compte que tu assumes là que l'utilisateur de la librairie va forcément mettre le résultat de init_sock() dans une variable de package $socket ? Et également que personne ne va essayer d'utiliser ce module à partir d'un autre module, mais uniquement à partir du package main ?
    Autrement dit ta bibliothèque est pratiquement inutilisable dans un environnement modulaire, je plains le pauvre programmeur qui voudrait réutiliser ta bibliothèque... (pense au futur, même toi tu pourrais être ce pauvre programmeur si tu dois reprendre cette bibliothèque dans trois mois !!)

    Soit tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # creating socket,connect it to irc & listen
    my $socket = init_sock();
    init_service( $socket );
    Avec les définitions qui vont bien, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub senddata
    {
    	my ($line, $sock) = @_;
    	my $send = "$line\r\n";
    	syswrite($sock, $send, length($send));
    	print "Sent: $line\n" if $NOFORK;
    }
    Soit tu fais cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # creating socket,connect it to irc & listen
    init_sock();
    init_service();
    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
    package Service;
    use strict;
    use Utils;
    require Exporter;
    our @ISA = qw(Exporter);
    our @EXPORT = qw(init_sock init_service);
     
    my $NOFORK = 1;
    my $sock;
     
    sub init_sock
    {
    	$sock = IO::Socket::INET->new(PeerHost => getconf("ip"),
    	                                   PeerPort => getconf("port"),
    	                                   Proto => 'TCP');
     
    	die "Can't connect to server: $!" unless $sock;
    	$sock->autoflush(1);
    }
     
    sub init_service
    {
        # link to server & listen sock
        senddata("SERVER ".getconf("service")." ".getconf("pass")." 0 :".getconf("desc")."");
        senddata("BURST");
    	senddata(":".getconf("service")." NICK ".time." ".getconf("nick")." ".getconf("host")." ".getconf("host")." ".getconf("ident")." ".getconf("modes")." 0.0.0.0 :".getconf("name")."");
    	senddata(":".getconf("nick")." OPERTYPE Services");
    	senddata(":".getconf("service")." FJOIN ".getconf("chan")." ".time()." :@,".getconf("nick")."");
    	senddata("ENDOFBURST");
        parse_line();
    }
     
    sub parse_line
    {
    	while (defined(my $line = <$sock>))
    	{
    		chomp $line;
    		print "Received: $line\n" if $NOFORK;
     
    		# Ping reply
    		if ($line =~ /^:(.+?)\sPING\s.+?$/)
    		{
    			senddata(":".getconf("service")." PONG $1");
    		}
    	}
    }
     
    sub senddata
    {
    	my $line = shift;
    	my $send = "$line\r\n";
    	syswrite($sock, $send, length($send));
    	print "Sent: $line\n" if $NOFORK;
    }
     
    1;
    Ou éventuellement tu fais de l'objet. Mais surtout, surtout tu n'utilises pas ce que tu viens d'écrire !!

    --
    Jedaï

  12. #12
    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 j'ai fait comme tu m'as dit (2eme solution), ca fonctionne bien merci

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