utilisation d'un fichier d'initialisation - Perl - Programmation
Marsh Posté le 09-03-2016 à 16:36:54
Pourquoi faire ça à la main, alors qu'il y a déjà des modules pour cela:
Config::IniFiles, Config::Simple ou Config::Ini (ou d'autres)
Choisis celui le plus adapté à tes besoins.
Par exemple, avec Config::IniFiles (je te déconseille Config::Simple, j'ai testé, et il est pas très pratique)
use Config::IniFiles;
......
my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
....
my $RepFacture = $cfg->val('repertoire', 'REP_FACTURE');
my $RepBulletin = $cfg->val('repertoire', 'REP_BULLETIN');
A+,
Marsh Posté le 09-03-2016 à 16:40:42
En faisant ce que tu me dis est ce qu'il va m'afficher tout les fichiers .txt qui se trouve dans le répertoire facture ?
Idem pour le répertoire bulletin_paie ?
Je vais essayer ta méthode je te tiens au courant au plus vite.
Merci pour ton aide.
Marsh Posté le 09-03-2016 à 18:13:07
Le code de gilou te sortira les chemins d'accèss de ton .ini, faudra ensuite appeler GetFilesList() avec (ou une fonction semblable).
Marsh Posté le 09-03-2016 à 22:29:46
Oui, le code que je t'ai donné, c'est pour exploiter ton .ini
Pour le reste, tu pourrais utiliser ta fonction GetFileList, mais la encore, il y a un module (standard) pour cela (et bien plus): File::Find
Code :
|
find fait le parcours récursif et appelle wanted pour chaque repertoire ou fichier trouvé
si c'est un fichier ( if (-f $_)) on ajoute à la liste le nom avec son path absolu à la liste (push @filelist, $File::Find::name)
Mais comme find met les noms (relatifs) sous forme unix, on remet ça en forme avant avec canonpath.
A+,
Marsh Posté le 10-03-2016 à 09:53:00
Bonjour,
Je viens d'instyaller Strawberry perl
lorsque j'exécute mon programme dans Powershell j'utilise la commande la suivante :
perl.exe C:\Users\baranowp\Documents\2016_03_07_11\param.pl C:\Users\baranowp\Documents\2016_03_07_11\param.ini
J'obtiens ce message d'erreur :
Can't locate Config/IniFiles.pm in @INC (you may need to install the Config::IniFiles module) (@INC contains: CStrawberry/perl/site/lib CStrawberry/perl/vendor/lib CStrawberry/perl/lib .) at C:\Users\baranowp\Documents\2016_03_07_11\param.pl line 3.
BEGIN failed--compilation aborted at C:\Users\baranowp\Documents\2016_03_07_11\param.pl line 3.
Et lorsque j'exécute mon programme depuis Geany j'obtiens :
' perl' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.
Marsh Posté le 10-03-2016 à 13:23:00
voir à la fin de http://forum.hardware.fr/hfr/Progr [...] m#t2277402
Marsh Posté le 10-03-2016 à 14:10:09
solerian a écrit : Bonjour, |
Ca te dit qu'il manque le module Config::IniFiles et qu'il faut l'installer.
L'article suivant: http://www.thegeekstuff.com/2008/0 [...] n-command/ dans sa seconde partie "Install Perl Modules using CPAN automatically" va vous expliquer très clairement la marche a suivre.
Bref vous installez cpan s'il n'est pas déjà installé, en suivant la procédure indiquée, puis vous faites
# cpan
....
cpan[1]> install "Config::IniFiles";
...
cpan[...]>quit
#
et ça devrait rouler (sauf erreur lors de l'installation du module par cpan, mais c'est relativement rare).
A+,
Marsh Posté le 10-03-2016 à 14:25:08
Je comprends mieux ma fonction GetFilesList mais j'ai quand même un message d'erreur que je ne comprend pas
Voici mon code :
use strict;
use warnings;
use Config::IniFiles;
my @directories_to_process;
my @filelist;
my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
foreach ('REP_FACTURE','REP_BULLETIN') {
push @directories_to_process, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
}
sub GetFilesList
{
my $Path = $_[0];
my $FileFound;
my @FilesList=();
## Lecture de la liste des fichiers
opendir (my $FhRep, $Path)
or die "Impossible d'ouvrir le repertoire $Path\n";
my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
closedir ($FhRep);
foreach my $FileFound (@Contenu) {
## Traitement des fichiers
if ( -f "$Path/$FileFound" ) {
push ( @FilesList, "$Path/$FileFound" );
}
## Traitement des repertoires
elsif ( -d "$Path/$FileFound" ) {
## Boucle pour lancer la recherche en mode recursif
push (@FilesList, GetFilesList("$Path/$FileFound" ) );
}
}
return @FilesList;
}
my @Files = GetFilesList my $repfacture;
foreach my $File (@Files) {
next unless $File =~ /\.txt$/i;
print "$File \n";
}
@Files = GetFilesList my $repbulletin;
foreach my $File (@Files) {
next unless $File =~ /\.txt$/i;
print "$File \n";
}
Voici le message d'erreur :
Use of uninitialized value $Path in opendir at C:\users\baranowp\Documents\2016_03_07_11\param.pl line 22.
Use of uninitialized value $Path in concatenation (.) or string at C:\users\baranowp\Documents\2016_03_07_11\param.pl line 22.
Marsh Posté le 10-03-2016 à 14:50:14
Tes appels de GetFilesList() ne sont pas bons. Le code de gilou sauvegarde les deux chemins d'accès dans @directories_to_process, donc soit tu utilises ça, soit tu adaptes le code.
Soit
Code :
|
soit
Code :
|
(non testé)
edit: Balises ton code!
Marsh Posté le 10-03-2016 à 15:46:14
Lorsque j'utilise ma commande perl.exe C:\Users\baranowp\Documents\2016_03_07_11\param.pl C:\Users\baranowp\Documents\2016_03_07_11\param.ini,
j'obtiens ce que je souhaite.
Maintenant il ne me reste plus qu'à traiter la seconde partie du fichier d'initialisation qui sont les fichiers paramètres
Contenu du fichier d'initialisation :
[repertoire]
REP_FACTURE=C:\Users\baranowp\Documents\2016_01_07_08\facture\
REP_BULLETIN=C:\Users\baranowp\Documents\2016_02_04_05\bulletin_paie\
[param_facture]
PARAM_FACTURE=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.txt
PARAM_FACTURE_LOG=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.log
Voici le programme utilisé pour traiter le fichier d'initialisation :
Code :
Code :
|
Voici ce que m'affiche ce programme :
La liste des différents fichiers contenu dans les répertoires factures et bulletin_paie et ce message d'erreur :
Use of uninitialized value $file in open at C:\users\baranowp\Documents\2016_03_07_11\param.pl line 55.
Use of uninitialized value $file in concatenation (.) or string at C:\users\baranowp\Documents\2016_03_07_11\param.pl line55.
Marsh Posté le 10-03-2016 à 16:07:27
Je suppose que le module a un problème à cause du désignateur(??) utilisé deux fois:
Citation : [param_facture] |
Pour débugger tu peux rajouter genre print join("\n", @directories_to_process) après tes foreach (soit ligne 14 ou après).
Par contre ton code n'est pas très propre: @directories_to_process c'est des (noms de) dossiers, alors que ce que tu rajoutes dans ta deuxième boucle foreach c'est des (noms de) fichiers. Rien ne t'empêches de faire autrement, genre
Code :
|
(non testé)
Astuce: Tu peux te passer des vérifications sur open() si tu utilises (rajout au début) use Autodie;
Marsh Posté le 10-03-2016 à 16:20:44
C'est ce que j'ai fait j'ai modifié les variables de cette façon :
Code :
|
Marsh Posté le 11-03-2016 à 16:17:52
Je rencontre un petit soucis,
Dans mon programme je ne veux plus voir apparaître d'arborescence de ce fait j'utilise le fichier d'initialisation comme vu précédement, Pour la focntion GetFilesList j'ai réussi à l'utiliser mais pour ce cas de figure je ne vois vraiment pas comment l'utiliser. Pour générer mon fichier de paramètre.log
Comme ceci ça fonctionne mais je ne veux plus voir l'arborescence.
Code :
|
Voici le fichier d'initialisation :
[param_facture]
PARAM_FACTURE=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.txt
PARAM_FACTURE_LOG=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.log
Cordialement
Marsh Posté le 11-03-2016 à 16:37:16
C'est moi qui a mal compris ou tu cherches simplement un truc genre
Code :
|
??
Dans ce cas autant virer le @parametre et la boucle qui va avec:
Code :
|
Marsh Posté le 11-03-2016 à 16:47:06
oui je veux un truc comme ça
Code :
|
De ce fait j'obtiendrais ça :
Code :
|
Marsh Posté le 09-03-2016 à 10:34:59
Bonjour à tous,
Je souhaiterai utiliser un fichier d'initialisation pour ne plus faire apparaître les arborescences dans mon programme.
Parce que le code que j'utilisais possédé les différentes arborescence et je souhaite m'en débarrasser :
:/Users/baranowp/Documents/2016_01_07_08
/facture/');
Users/baranowp/Documents/2016_02_04_05/
bulletin_paie/');
Ce code m'affiche tout les fichiers de type txt se trouvant dans le répertoire facture et bulletin_paie.
Je souhaite utiliser un fichier d'initialisation pour remédier à ce problème.
Voici le contenu de ce fichier d'initialisation param.ini :
[repertoire]
REP_FACTURE=C:\
Users\baranowp\Documents\2016_01_07_08
\facture\
REP_BULLETIN=C:\
Users\baranowp\Documents\2016_02_04_05\
bulletin_paie\
Voici le code que j'utilise en ce moment :
Je ne vois pas coment je peux utiliser la fonction GetFilesList dans mon programme, et je ne sais pas si mon programme fait appel à mon fichier d'initialisation.
J'espère que mes explications sont claires, si vous voulez plus d'informations n'hésiter pas.
Cordialement