retrouver un mot dans un Fichier - Perl - Programmation
Marsh Posté le 27-04-2015 à 14:32:29
Moi aussi je suis débutant, mon script fonctionne mais gilou (qui s'y connait très bien) aura peut-être des améliorations à proposer. J'ai mis quelque commentaires, si tu ne comprends pas demande moi!
Code :
|
Marsh Posté le 27-04-2015 à 20:41:28
rat de combat a écrit : Moi aussi je suis débutant, mon script fonctionne mais gilou (qui s'y connait très bien) aura peut-être des améliorations à proposer. |
C'est bien, j'aurais condensé un peu:
Code :
|
La seule différence essentielle est que je préfère des filehandle locaux, mais c'est juste une question de style.
A+,
Marsh Posté le 27-04-2015 à 22:19:04
Non, ça c'était juste pour répondre au rongeur combatif.
J'aurais procédé ainsi:
Code :
|
J'aurais utilisé le module File::Grep, qui fait tout le boulot de parsing, et utilisé le fait qu'il retourne une structure qui contient toute l'info utile.
Sur ton exemple, fgrep retourne une liste dont le premier (et unique élément) est une référence sur un hash:
$fichiers[0] = {
'count' => 3,
'matches' => {
'6' => "doc3,/dev/lg_dumplv,/dev/sysdumpnull,/var/adm/ras,1,fault,fw-assisted,disallow,\n",
'3' => "d100spuptl25e0,/dev/lg_dumplv,/dev/sysdumpnull,/var/adm/ras,1,1,fault,disallow,\n",
'7' => "doc4,5,fault,7,8,9,10,disallow,\n"
},
'filename' => 'aaz.txt'
};
A+,
Marsh Posté le 27-04-2015 à 22:43:05
je trouve ta premiere proposition, bonne pour la comprenhesion
Marsh Posté le 27-04-2015 à 23:15:00
C'est le principe de Perl: il n'y a pas UNE bonne solution, toute solution adaptée au niveau de celui qui l'utilise est bonne.
J'aurais pu écrire la mienne ainsi:
Code :
|
Mais ça aurait été moins (ou pas) lisible a qui n'est pas un utilisateur avancé.
Le truc utile utilisé ici: si %hash est un hash, map {$hash{$_}} sort keys %hash; renvoie la liste des valeurs du hash, triées dans l'ordre des clés.
Tiens, une variante plus simple de mon premier post:
Code :
|
Plutôt que de splitter en champs séparés par une virgule, et ne garder que le premier champ je vire tout ce qui après la première virgule (sauf le \n final). C'est probablement plus optimal.
j'aurais pu écrire map { s/,.*//; $_ } grep { /,fault,/ } à la place de grep { /,fault,/ and s/,.*// } pour faire plus pédagogique.
A+,
Marsh Posté le 28-04-2015 à 10:58:21
exactement ceci et vraiment plus simple,car je dois essaye de comprendre comment est ce que cela fonctionne merci bien
Marsh Posté le 28-04-2015 à 11:02:27
mais dit pourquoi 0+@fichiers, le 0 qu'est ce que tu veus dire pas j'aurai imagine scalar @fichiers
Marsh Posté le 28-04-2015 à 11:49:16
j'avais encore une question comme vous l'avez remarque le resultat du fichier suivant n'ai pas agreable a lire:
default,primary,secondary,copy_directory,forced_copy_flag,always_allow_dump,type_of_dump,full_memory_dump,
d100spuptl25e0,/dev/lg_dumplv,/dev/sysdumpnull,/var/adm/ras,1,1,fault,disallow,
doc1,/del,/dev/null,/ras,1,0,fw-assisted,disallow,
doc2,/dev/lg_dumplv,/dev/sysdumpnull,//ras,1,1,fw,disallow,
doc3,/dev/lg_dumplv,/dev/sysdumpnull,/var/adm/ras,1,fault,fw-assisted,disallow,
doc4[/#FF1C00],5,fault,7,8,9,10,disallow,
j'aimerai savoir si il est possible en perl .d'ecrire un code capable d'ecrire cela dans une table html mais ce qui important de savoir est que le Tableau 6 lignes et 8 colonnes ceci peut toujours varie
du genre 4000 ligne et peut etre 200 colonnes. plus bas vous pouvez trouver mon code qui me donne ce resultat peut quelqu'un pourrai savoir ce qu'il faudrai que j'y ajoute. comme je l'ai mensionne le resultat je l'obtient comme en haut j'aimerai savoir si il est posible de l'avoir du genre comme ceci en desous.
default primary secondary copy_directory forced_copy_flag always_allow_dump type_of_dump full_memory_dump
d100spuptl25e0 /dev/lg_dumplv /dev/sysdumpnull /var/adm/ras 1 1 fault disallow
doc1 /del /dev/null /ras 1 0 fw-assisted disallow
doc2 /dev/lg_dumplv /dev/sysdumpnull //ras 1 1 fw disallow
doc3 /dev/lg_dumplv /dev/sysdumpnull /var/adm/ras 1 fault fw-assisted disallow
doc4 5 fault 7 8 9 10 disallow
Code :
|
Marsh Posté le 28-04-2015 à 11:51:40
Henri772 a écrit : mais dit pourquoi 0+@fichiers, le 0 qu'est ce que tu veus dire pas j'aurai imagine scalar @fichiers |
La variable @fichiers est une liste. Si j'appelle print dessus, ça va imprimer le contenu de la liste.
Je veux forcer une interprétation scalaire de la variable, ce qui me donnera son nombre d'éléments.
Je pourrais en effet utiliser l'opérateur unaire scalar de perl, et écrire scalar @fichiers, mais dans la pratique, on utilise souvent l'idiome 0+@fichiers, l'addition d'un nombre forçant l'interprétation scalaire de @fichiers. Je suppose que cette pratique provient des temps reculés ou l'opérateur scalar n'existait pas dans le langage.
J'aurais aussi pu faire $#fichiers + 1.
C'est juste une question d'habitude.
A+,
Marsh Posté le 28-04-2015 à 12:08:48
Henri772 a écrit : j'aimerai savoir si il est possible en perl .d'ecrire un code capable d'ecrire cela dans une table html mais ce qui important de savoir est que le Tableau 6 lignes et 8 colonnes ceci peut toujours varie du genre 4000 ligne et peut etre 200 colonnes. plus bas vous pouvez trouver mon code qui me donne ce resultat peut quelqu'un pourrai savoir ce qu'il faudrai que j'y ajoute. comme je l'ai mensionne le resultat je l'obtient comme en haut j'aimerai savoir si il est posible de l'avoir du genre comme ceci en desous. |
C'est pas très clair ton histoire.
A+,
Marsh Posté le 28-04-2015 à 13:15:18
Gilou ilmalheureusement impossible des poste l'un des fichiers donc je possede sur le forum la tu allais faire la remaque que un Fichier en possede des milliers d'attributs value, et par ailleur si on parse un tel fichier, ceci n'ai pas agreable pour l'oeil de pouvoir lire le resultat car, il apparaitra des nombre et caractere separe de virgule.
Marsh Posté le 28-04-2015 à 13:40:41
CE qui n'est pas clair, c'est ce que tu veux obtenir au final.
Une table html? une fichier texte séparé par des tabulations? etc.
Si c'est pour une table html, je te suggère d'aller voir du côté de HTML::Table::Compiler qui est très pratique pour remplir une table avec une liste de valeurs.
A+,
Marsh Posté le 29-04-2015 à 21:47:26
Merci gilou pour la relecture de mon code! Bien vu qu'il ne faut pas de variable en plus pour compter le nombre de fichiers. Et je note le coup du 0+@fichiers qui est plus court que scalar() que j'utilise habituellement.
Marsh Posté le 27-04-2015 à 13:26:25
Salut je suis un debutant en Perl et je n'ai pas encore de l'experience et j'ai besoin de votre aide.
j'ai un fichier contenant des results de traitement de d'autre Fichiers que j'aimerai un peu avoir un bon appercu, au fait dans mon Fichier il ya les resultats suivant:
default,primary,secondary,copy_directory,forced_copy_flag,always_allow_dump,type_of_dump,full_memory_dump,
d100spuptl25e0,/dev/lg_dumplv,/dev/sysdumpnull,/var/adm/ras,1,1,fault,disallow,
doc1,/del,/dev/null,/ras,1,0,fw-assisted,disallow,
doc2,/dev/lg_dumplv,/dev/sysdumpnull,//ras,1,1,fw,disallow,
doc3,/dev/lg_dumplv,/dev/sysdumpnull,/var/adm/ras,1,fault,fw-assisted,disallow,
doc4[/#FF1C00],5,fault,7,8,9,10,disallow,
en rouge ce sont les noms des fichiers, en noir ce sont des valeurs le premier fichier default ne doit pas etre pris en consideration, seul les autres fichiers doivent etres traite
j'aimerai que les noms des fichier ayant la valeur "fault" me soit retourne, et ainsi que leur nombre. Dans la cas ici present le
resultat serait:
nombre de fichiers: 3
d100spuptl25e0
doc3
doc4