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 :

récupérer un hash


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut récupérer un hash
    Bonjour,
    J’ai un ensemble de fichiers avec ce type de données :
    1:3:
    2:1599:
    6:4:
    17:3246:
    112:5545:

    Je souhaite traiter ces fichiers. Pour cela j’utilise donc ce code avec une fonction qui retourne le nom des fichiers et une autre qui les ouvre , renvoie leur contenue dans un hash et retourne ce hash au main.
    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
     
    #!/usr/bin/perl -w
    use Carp; 
    use strict;
     
    my $repertoire = "/home/baptiste/Desktop/test/";
    my @fichier = lister_fichiers($repertoire);
     
    foreach my $fic (@fichier){
    	#my $ref=fct($fic);
    	my %ltemp=fct($fic);
    	print "$fic \n";
    	#my %ltemp = %$ref;
    	foreach ((my $key,my $valeur)=each(%ltemp)){
    		print "ltemp : code ".$key." valeur : ".$valeur."\n";
    	}
    }
     
     
    sub fct (){
    	my($fich) = @_;
    	open FICHIER , "< ./test/$fich ";
    	my %list;
     
    	while (my $ligne = <FICHIER>){
    		(my $num,my $nb)=split(/:/,$ligne);
    		$list{$num}=$nb;
    	}
    	close FICHIER;
     
    	while ((my $cle,my $val) = each(%list)){
    		print "code : ".$cle." nombre d enregistrement : ".$val."\n";
    	}
     
    #my $ref_list = \%list;
    #return ($ref_list);
    return (%list);
    }
     
    sub lister_fichiers {
    	my ($repertoire)= @_;
    	my @fichiers = ();
     
    	opendir (my $rep_fh, $repertoire) or die "impossible d ouvrir \n";
     
    	my @file_rep = grep { !/^\.\.?$/ } readdir($rep_fh);  
    	closedir ($rep_fh);
     
    	foreach my $nom (@file_rep) {   
    		if (-f "$repertoire/$nom") { 
    			push (@fichiers, "$nom"); 
    		}
    	}
    return @fichiers;
    }
    Cependant je n’arrive pas à récupérer le hash dans mon main.
    Apres exection de ce script j’obtiens :
    yyyyy.dcnt1.org
    code : 112 nombre d enregistrement : 5545
    code : 6 nombre d enregistrement : 4
    code : 1 nombre d enregistrement : 3
    code : 17 nombre d enregistrement : 3246
    code : 2 nombre d enregistrement : 1599
    ltemp : code 6 valeur : 4
    ltemp : code 6 valeur : 4
    xxxx.dcnt1.org
    code : 112 nombre d enregistrement : 5547777777
    code : 6 nombre d enregistrement : 4
    code : 1 nombre d enregistrement : 3
    code : 17 nombre d enregistrement : 2907
    code : 2 nombre d enregistrement : 1433
    ltemp : code 6 valeur : 4
    ltemp : code 6 valeur : 4

    J’ai aussi essayé de le passer par référence (comme mis en commentaire mais le résultat et le même). Auriez vous une solution à ce problème ou quelques conseils ?
    merci à vous .

  2. #2
    Expert confirmé
    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
    Par défaut
    Dans ton code principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	foreach ((my $key,my $valeur)=each(%ltemp)){
    		print "ltemp : code ".$key." valeur : ".$valeur."\n";
    	}
    Dans ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	while ((my $cle,my $val) = each(%list)){
    		print "code : ".$cle." nombre d enregistrement : ".$val."\n";
    	}
    Il y en a un qui marche et l'autre non... Peut-être y a-t-il une petite différence entre les deux codes, non ?
    Distraction quand tu nous tiens !

    Soit dit en passant, je remarque que c'est ton premier message sur le forum, mais non seulement tu as pensé aux balises autour de ton code, mais tu as posé ta question parfaitement, au bon endroit et avec tous les ingrédients nécessaire pour y répondre, félicitation !! (c'est tellement rare, j'en pleurerai presque )

    --
    Jedaï

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    Merci beaucoup (tant pour la réponse que pour les compliments ). En effet c’était bien une erreur d’étourderie…
    Par contre, je souhaiterai savoir si une référence en perl c’était comme une référence en C++ ou un pointeur (tjrs en C++)? Parce que j’ai lu que c’était comme un pointeur mais je ne sais pas trop.
    Merci encore à vous

  4. #4
    Expert confirmé
    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
    Par défaut
    C'est plutôt comme un pointeur sauf que tu ne peux pas faire d'arithmétique de pointeur dessus. Les références en C++ sont plutôt comme les "alias" en Perl.
    En fait tout est "passé par référence" (par opposition au "passage par valeur") en Perl, sauf que l'idiome classique pour récupérer les arguments d'une fonction masque ce fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub addOne { $_[0]++ }
     
    my $i = 0;
    addOne($i);
    print $i, "\n"; # 1
     
    sub addOneToCopy { my ($arg) = @_; $arg++; return $arg; }
     
    my $j = addOneToCopy($i);
    print $i, "\n"; # 1
    print $j, "\n"; # 2
    (Evidemment quand on te dit passe tes arguments par référence en Perl, on fait allusion aux références de Perl, pas au "passage par référence" de l'informatique théorique)
    --
    Jedaï

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    ok , merci beaucoup pour cette précision

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

Discussions similaires

  1. [PHP 5.4] Impossible de récupérer le hash des fichiers
    Par mnw.william dans le forum Langage
    Réponses: 3
    Dernier message: 02/07/2012, 21h57
  2. Récupérer valeur de addElement('hash', etc)
    Par omageus dans le forum Zend_Form
    Réponses: 1
    Dernier message: 22/03/2010, 17h57
  3. Problème récupérer les valeurs dans une Hash
    Par pymouse dans le forum Langage
    Réponses: 4
    Dernier message: 12/07/2007, 17h11
  4. Réponses: 11
    Dernier message: 23/07/2002, 14h33

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