Forum Programmation.perl La clef d'une valeur présente dans un hash

Posté par  . Licence CC By‑SA.
Étiquettes :
0
1
août
2014

Bonjour,

Pour un script qui analyse des fichiers présents dans des dossiers, j'essaye d'associer un langage avec une extension de fichier.

Par exemple, le script scrute un répertoire et trouve un .pl ou .pm dedans et il en déduit que c'est du langage Perl.

Je me suis dit que ceci ferait l'affaire pour essayer d'associer les extensions aux langages (la recherche dans le dossier fonctionne déjà):

#!/usr/bin/env/perl

use warnings;
use utf8;

my %hashLang = (
    'Perl' => ['pl', 'pm'],
    'Python' => ['py', 'pyw'],
    );

# Afficher les clefs
my @tabkeys = sort keys(%hashLang);
print("@tabkeys");

Ainsi j'ai toutes mes clefs triés. Par contre, je cherche actuellement un moyen de trouver la clef associée à une valeur trouvée dans le hash…

==> Comment récupérer la clef associée à une valeur trouvée dans le hash ?

Je suis passé sur un chan Irc anglais vite fait et on m'a dit que "ce n'était plus possible"… Sans me prouver quoique ce soit, j'avais plus l'impression de déranger qu'autre chose (pas très causant avec les débutant ces anglais :D ).

Si toutefois il est vrai que c'est impossible, auriez-vous une autre méthode ou un module Perl qui puisse faire ce genre de chose ?

Dans le cas où c'est possible, comment ?

D'avance merci de vos réponses et bon début de weekend !

  • # Un autre hash

    Posté par  (site Web personnel) . Évalué à 4. Dernière modification le 01/08/14 à 17:56.

    Tu peux rajouter un autre hash comme ceci :

    my %langHash = ();                                                                                                     
    foreach my $key (keys %hashLang) {                                                                                      
        foreach my $ext (@{ $hashLang{$key} }) {                                                                            
            $langHash{$ext} = $key;                                                                                        
        }    
    }
    
    print $langHash{py};

    Ça suppose que ton hash de départ n'envoie pas deux langages différents sur la même extension.

    Edit : par contre, tes clés doivent forcément être des chaînes de caractères, pas des tableaux, donc tu dois faire comme j'ai fait autant de clés qu'il y a d'extensions pour chaque langage.

    • [^] # Re: Un autre hash

      Posté par  . Évalué à 2.

      Bonjour et merci de ta réponse.

      Par contre, je ne suis pas expert dans Perl (je débute) et j'avoue avoir du mal à comprendre le code présenté…

      En fait c'est surtout le foreach imbriqué qui pose soucis. En gros pour chaque itération du premier foreach on retourne la clef du hash %hashLang. Par contre le deuxième j'ai du mal sur le @{ $hashLang{$key} }… $ext contient la clef de %hashlang et on remplit le hash %langHash avec les clefs en bouclant ? Sauf que %hashLang est un hash et pas un tableau donc pourquoi commencer par @ ?

      • [^] # Re: Un autre hash

        Posté par  (site Web personnel) . Évalué à 3. Dernière modification le 01/08/14 à 19:00.

        Les valeurs d'un hash (ou d'un tableau) ne peuvent être que des scalaires, donc entre autres, des nombres, des chaînes ou des références. En l'occurrence les valeurs du hash %hashLang sont des références à un tableau (c'est pour ça que tu utilises [] et pas des parenthèses, ça crée une référence anonyme à un tableau). Avec @{ $reference_a_un_tableau } tu récupères le tableau à partir de la référence. De même, %{ $reference_a_un_hash } récupère un hash à partir d'une référence.

        Je te conseille de lire man perlreftut et/ou man perlref pour comprendre comment marchent les références.

        • [^] # Re: Un autre hash

          Posté par  . Évalué à 1.

          Ha, en effet, c'est un poil plus compliqué que ce que je pensais !

          Je vais potasser tout ça histoire de tout bien comprendre pour terminer le script. Je te remercie de ta patience, pédagogie et pour tes explications.

          A bientôt !

  • # type "mime"

    Posté par  . Évalué à 4.

    Pour info, il y a une commande pour récupérer le type de fichier directement:

    http://linux.die.net/man/1/mimetype

    • [^] # Re: type "mime"

      Posté par  . Évalué à 1.

      Merci pour l'astuce, même si au final j'ai utilisé File::Basename pour décortiquer chemin / nom / suffixe. :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.