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 anaseto . Évalué à 4. Dernière modification le 01 août 2014 à 17:56.
Tu peux rajouter un autre hash comme ceci :
Ç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 Pwayt . É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 anaseto . Évalué à 3. Dernière modification le 01 août 2014 à 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/ouman perlref
pour comprendre comment marchent les références.[^] # Re: Un autre hash
Posté par Pwayt . É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 keyser.dyson . É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 Pwayt . É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 à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.