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 :

table de hash


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 table de hash
    Bonsoir à tous,

    J'ai un petit soucis, voici mon probleme:
    J'ai un fichier principale 'services.pl' ou je lance toutes les taches a effectuées
    voici le code source de ce fichier:

    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
     
    use strict;
    use Socket;
     
    # Modules necessaire
    use Divers;
    use Connection;
     
    # table de hash
    my %config;
    my %access;
     
    # stockage de la configuration et des accés dans les tables
    Divers::load_config(\%config);
    Divers::load_access(\%access);
     
    # creation du socket et connexion vers irc
    Connection::build_sock;
     
    # mise en arriere plan
    Divers::fork;
    Je fais appel dans ce fichier d'un autre fichier (package) 'Divers.pm'
    fichier dans lequel je créer mes tables config et access, voici le code:

    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
     
    package Divers;
    use strict;
     
    sub load_config
    {
    	my ($config) = shift;
    	my $path = "config/uworld.conf";
    	open(FILE, "$path") or die "load_config() erreur: $!";
    	while(my $line = <FILE>)
    	{
    		chomp($line);
    		if ($line =~/^uw_(.+?)=(.+?)$/)
    		{
    			$config->{"$1"} = "$2";
    		}
    	}
    	close(FILE);
    }
     
    sub load_access
    {
    	print "Je lis les accés\n";
    }
     
    sub fork
    {
    	print "Je fork\n";
    }
     
    1;
    Alors tout fonctionne bien, ce que je voudrai faire c'est pouvoir réutiliser une table créer dans Divers.pm (la table %config) dans le fichier 'services.pl' ou un autre fichier pouvez vous m'eclairer ?

    désolé si ma question est stupide mais j'ai lu la faq perl et j'ai toujours pas trouvé ...

    en tout cas merci

  2. #2
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    ce que je voudrai faire c'est pouvoir réutiliser une table créer dans Divers.pm (la table %config) dans le fichier 'services.pl' ou un autre fichier pouvez vous m'eclairer ?
    Je suis peut être un peu fatigué mais c'est déjà ce que tu fais, non ? Tu passes une référence (\%config) à ta fonction loadconfig() – peu importe que cette dernière soit dans divers.pm – tu peux donc continuer à l'utiliser dans ton script services.pl.

    Pour t'en persuader rajoute un après l'appel à loadconfig() dans services.pl.

    Ou alors je n'ai rien compris, ce qui est fort possible.

  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
    Salut iblis

    oui en effet ca fonctionne , je n'arrivai pas a afficher $config->{parametre} mais en fait il faut le faire comme ceci %config->{parametre} , au passage peut tu m'expliquer la difference entre quelque chose du stye $config{param} et $config->{param} a quoi sert le -> ?

    a plus

  4. #4
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Bonsoir.

    En attendant que des personnes plus compétentes te donnent tous les détails, je te dis comment je vois ça.

    Dans un cas tu travailles sur un tableau associatif (ou hash), dans l'autre sur une référence à un tableau associatif. La syntaxe pour l'accès aux valeurs varie en fonction.

    Pour plus de clarté, considère le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my %hash = ('key1', 'value1', 'key2', 'value2');
    my $href = \%hash;
    print $hash{'key1'}."\n";
    print $href->{'key1'}."\n";
    Dans ton cas (réutilises-tu un code existant ?) tu passes à loadcong() une référence à %config. Dans loadconfig(), tu traites un scalaire, $config, (en perl le typage est marqué syntaxiquement) qui contient une référence sur un hash, d'où la syntaxe avec -> lors de l'accès. Mais quand tu accèdes directement à ton hash (le problème c'est que tu as utilisé le même nom pour le hash et la référence, source de confusion) pas de ->. L'exemple ci-dessus dit tout cela plus clairement.

  5. #5
    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

    En fait ce que je voudrai c'est créer une table hash $config{parametre} qui contiendrai les valeurs recoltées dans mon fichier configuration et qui sont declarées dans la fonction loadconfig() et pouvoir reutiliser ces hash dans n'importe quel fichier de mon programme. ou faire un truc plus propre genre:

    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
     
    sub load_config
    {
    	my $path = "config/uworld.conf";
    	open(FILE, "$path") or die "load_config() erreur: $!";
    	while(my $line = <FILE>)
    	{
    		chomp($line);
    		if ($line =~/^uw_(.+?)=(.+?)$/)
    		{
    			$config{"$1"} = "$2";
    		}
    	}
     
    	# pour faire plus propre je declare les elements de la table config dans des variables scalaires
    	$serveur_ip = $config{'ip'};
    	$serveur_port = $config{'port'};
    	# etc ... avec tout le reste de la configuration
     
    	close(FILE);
    }
    dans le cas du code ci-dessus ce serait les variables $serveur_ip et $serveur_port que je voudrai utiliser dans un autre fichier .
    Je suis désolé si je ne suis pas vraiment clair.

  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
    Hi

    En fait ce que je voudrai c'est créer une table hash $config{parametre} qui contiendrai les valeurs recoltées dans mon fichier configuration et qui sont declarées dans la fonction loadconfig() et pouvoir reutiliser ces hash dans n'importe quel fichier de mon programme. ou faire un truc plus propre genre:

    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
     
    sub load_config
    {
    	my $path = "config/uworld.conf";
    	open(FILE, "$path") or die "load_config() erreur: $!";
    	while(my $line = <FILE>)
    	{
    		chomp($line);
    		if ($line =~/^uw_(.+?)=(.+?)$/)
    		{
    			$config{"$1"} = "$2";
    		}
    	}
     
    	# pour faire plus propre je declare les elements de la table config dans des variables scalaires
    	$serveur_ip = $config{'ip'};
    	$serveur_port = $config{'port'};
    	# etc ... avec tout le reste de la configuration
     
    	close(FILE);
    }
    dans le cas du code ci-dessus ce serait les variables $serveur_ip et $serveur_port que je voudrai utiliser dans un autre fichier .
    Je suis désolé si je ne suis pas vraiment clair.

  7. #7
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    :Une fois encore, je pense que ce que tu faisais au début est bon : déclarer un hash, passer sa référence à une routine qui y charge les données lu d'un fichier, continuer le traitement. En gros comme ça (c'est ton premier code à peine modifié et c'est fonctionnel)
    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
    use strict;
     
    my %config;
    load_config(\%config);
     
    # processing
    map {print "$_ $config{$_}\n"} sort keys %config;
     
    sub load_config
    {
        my ($confref) = shift;
        while(my $line = <DATA>)
        {
            chomp($line);
            if ($line =~/^uw_(.+?)=(.+?)$/)
            {
                $confref->{"$1"} = "$2";
            }
        }
    }
     
    __DATA__
    uw_x=1
    uw_y=2
    uw_z=3
    Dans le dernier code que tu fournis tu ne passes plus ton à hash à load_config(), là, oui, à mon avis, il y a un problème.

  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
    Ok iblis en effet c'est parceque j'essayer d'imprimer $config->{ip} et non $config{ip} ca c'est reglé mais pour utiliser a nouveau $config{ip} dans un autre fichier que le services.pl ou Divers.pm, il faut obligatoirement que je le passe en reference a la fonction qui se trouve dans un autre fichier ou y a t'il un autre moyen ?

    merci de ton aide en tout cas

  9. #9
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    En Perl, tu ne peux passer qu'un type de variable à une fonction : un scalaire. Donc pour un hash (ou un tableau) tu n'as pas le choix, tu dois passer une référence, c'est à dire une variable scalaire contenant l'adresse perl de ton hash (ou de ton tableau). Cela n'a rien à voir avec le fait que tu packages (oh le vilain mot) tes fonctions dans des fichiers séparés.

    Avec des variables scalaires (chaînes de caractères, entier ...) tu as le choix, tu peux passer la valeur ou la référence, dans le second cas principalement lorsque tu veux altérer la valeur de la variable.

    Si tu veux que tes variables (scalaires ou non) soient visibles partout tu dois les déclarer comme des variables globales avec our au lieu de my. Les variables sans my, refusées si tu utilises le pragma strict (ce qui est une très très bonne idée), sont globales.

    Tu peux aussi exporter les variables. Lis la doc perl là dessus. Je n'en sais pas plus.

  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
    Yep

    ok, merci pour tout ces renseignements iblis, j'ai encore une question pour changer, c'est possible de déclarer une variable globale dans une fonction ?

  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
    C'est possible (avec our()), néanmoins les variables globales sont très (très) rarement une bonne idée, utiliser un accesseur ou quelque chose comme ça est bien plus souple et prudent. Aussi essaie de construire de vrais modules qui exporte des choses plutôt que de simples fichiers Perl que tu require()s.

    --
    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
    Yop,

    J'ai regardé un peu comment sont foutu les modules perl, le probleme c'est que les fichiers sont bien trop compliqués a décortiquer pour un débutant donc si quelqu'un connait un tuto sympa sur "comment créer un vrai module perl" je suis preneur

    à plus

  13. #13
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Données et exemples de base, en français s'il vous plaît, ici même. En anglais, les classiques, et .

  14. #14
    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
    Salut iblis,
    exactement ce qu'il me fallait merci bien

  15. #15
    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
    Salut

    j'ai une question qui va peut être sembler stupide mais existe t'il une commande perl permettant de compter le nombre d'argument dans une chaine ?

    ca n'a plus rien a voir avec le sujet mais je n'allais pas en recréer un pour ca

  16. #16
    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
    "Compter le nombre d'arguments" dans une chaîne ne veut pas dire grand chose... S'agit-il de compter le nombre de mots, d'utiliser un parsing proche de celui du shell (duquel d'ailleurs ?) ??

    --
    Jedaï

  17. #17
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    A mon avis y faut (créer un sujet pour ça).

    Par ailleurs, pour ma part je n'ai pas bien compris la question : arguments ? dans une chaîne ? Tu veux compter les mots ? Ou les mots moins le premier et moins ceux qui commencent par - ?

  18. #18
    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
    Oui oui, le nombre de mot dans une phrase, chaine, string ?, je croyai que la fonction length faisait ca mais non ...
    en tout cas vous degainez vite !

  19. #19
    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
    length compte le nombre de caractères dans la chaîne, besoin beaucoup plus courant que celui de compter les "mots", notion ô combien nébuleuse.
    Bon en supposant que tu définisses "mots" comme étant "suite de caractères non-espaces", tu pourrais avoir ta réponse avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $words_number = () = ($string =~ m/\S+/g);
    ou peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $words_number = split /\s+/, $string;
    --
    Jedaï

  20. #20
    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

    c'est pourtant souvant utile de compter le nombre de mots dans une ligne, dans mon cas je lis un fichier et ne recupere que les lignes qui contiennent 5 mots pour pouvoir établir une liste d'accés, voici ce que j'ai fait:

    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
     
    sub load_access
    {
    	my ($access) = shift;
    	my $path = "users/users.list";
    	open(FILE, "$path") or die "load_access() erreur: $!";
    	while(my $line = <FILE>)
    	{
    		chomp($line);
    		my $nbre_mots = split /\s+/, $line;
    		if ($nbre_mots == 5)
    		{
    			print "J'ai $nbre_mots dans: $line\n";
    		}
    	}
    	close(FILE);
    }
    Il ne me reste plus qu'a recuperer les "mots" un par un pour construire ma table de hash

    Merci à vous deux :p

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. tableau de tables de hash référence perl
    Par sbtrinity dans le forum Langage
    Réponses: 11
    Dernier message: 12/03/2012, 14h02
  2. table, liste, hash et tout et tout.. pour débutant
    Par Eric5959 dans le forum Langage
    Réponses: 22
    Dernier message: 01/08/2008, 09h16
  3. Table de hash limité ??
    Par elbrujo2323 dans le forum Langage
    Réponses: 14
    Dernier message: 17/01/2008, 21h32
  4. Table de hash et package.
    Par Marty000 dans le forum Langage
    Réponses: 2
    Dernier message: 25/01/2007, 09h52
  5. Tables de hash
    Par miss8 dans le forum C
    Réponses: 2
    Dernier message: 16/11/2002, 17h44

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