[PERL]- traduire du shell en perl
tonixm Messages postés 127 Statut Membre -
Avis aux habitués!!
je suis en train de me mordre les doigts sur une traduction d'un programme en perl:
cat $Conf_file | while read line
do
cat $File.sort | grep -v -w "$line" > $File.tmp
cat $File.tmp > $File.sort
done
cat $File.sort | sort >> $File.focal
Merci de tout coeur!!!
90 réponses
- 1
- 2
- 3
- 4
- 5
Le problème porte sur la traduction et la correction d’un script Perl qui filtre des lignes d’un fichier de configuration en les confrontant à des motifs issus d’un fichier d’analyse. Des propositions proposent une implémentation plus robuste en Perl, avec strict et warnings, l’ouverture des fichiers, puis une boucle qui filtre les lignes selon les motifs de fichier analyse et conf. D'autres interventions évoquent la traçabilité via un fichier .debug pour enregistrer les lignes écartées et une sortie vers .tmp et .debug, afin d’observer le comportement sans perte de données. En pratique, certaines améliorations préconisent d’éviter les constructions issues de shell comme cat et grep et d’utiliser les fichiers et les expressions régulières directement dans Perl.
-
essaie ça
#!/usr/bin/perl use strict;use warnings; open CONF,"fichier.conf" or die "E/S : $!\n"; open ANALYSE,"fichier.analyse" or die "E/S : $!\n"; open TMP,">fichier.tmp" or die "E/S : $!\n"; my @conf=<CONF>; chomp @conf; while(my $e=<ANALYSE>){ print TMP $e unless grep { if($_=~/\|/){ my ($x,$y)=split /\|/,$_; $y=~s/^\s*(.*)/$1/; $e=~/${x}.*$y/; }else{ $e=~/$_/; } } @conf; } __END__ -
j'ai essayé cela mais sans succès:
local ($line); # déclaration locale d'une variable
foreach $line ($conf_file){
# On test $file.analyse pour savoir s'il ne contient pas les lignes $line
# et on met dans $file.tmp les éléments de $file.analyse différents de $line
if($file_analyse!=~ m/$line/i){
system("cat $file_analyse > $file_tmp");
}
system("cat $file_tmp > $file_analyse");
}
system("cat $file_analyse | sort >> $file_focal"); -
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Salut,
vu aussi l'autre message je pense qu'on a un p'tit problème ;-))
ce n'est pas comme ça qu'on traduit un programme.
tu dois expliquer ce qu'il fait et ensuite on verrra -
-
ce que t'as fait dans ton message ce n'est pas du perl
tu fait appel aux commandes système grâce à la fonction system()
si tu veux vraiment du pur Perl, explice ce que tu dois traiter et ce que tu veux obtenir et je vais t'aider
à toi -
merci.
cat $Conf_file | while read line
do
cat $File.sort | grep -v -w "$line" > $File.tmp
cat $File.tmp > $File.sort
done
cat $File.sort | sort >> $File.focal
Il faut que je lise chaque ligne du fichier.sort (qui est le fichier à traiter) et je le compare a toutes les lignes de mon fichier de conf qui est $conf_file.
Si mon fichier.sort ne ressemble a aucune lignes du fichier de conf je met cette ligne provisoirement dans un fichier .tmp
Je fais cela pour toutes les lignes de mon fichier.sort.
Puis je met le fichier.tmp dans le .sort du départ en concaténant et en écrasant ce qu'il y avait au debut.
Et finalement je concatène le fichier.sort après l'avoir trié par ordre alphabétique dans le fichier.focal
j'espere avoir été clair sinon demande moi -
-
d'accord je retiens!!! tu m'oubli pas!!!!
en tous cas merci !! -
tu m'oubli pas!!!!
c'est vrai que j'ai la mémoire courte et en plus je suis paresseux
toutefois je ferai un effort pour ne pas oublié ;-)) -
-
Qui saurait faire cela en perl:
Il faut que je lise chaque ligne du fichier.sort (qui est le fichier à traiter) et je le compare a toutes les lignes de mon fichier de conf qui est $conf_file.
Si mon fichier.sort ne ressemble a aucune lignes du fichier de conf je met cette ligne provisoirement dans un fichier .tmp
Je fais cela pour toutes les lignes de mon fichier.sort.
Puis je met le fichier.tmp dans le .sort du départ en concaténant et en écrasant ce qu'il y avait au debut.
Et finalement je concatène le fichier.sort après l'avoir trié par ordre alphabétique dans le fichier.focal -
Je ne comprends pas cette partie en concaténant et en écrasant ce qu'il y avait au debut.
que veut tu faire exactement?
montre un exemple.
-
oui je veux dire par là faire une ecriture en ecrasant ce qu'il y avait au debut: > écriture (ecrasement)
Début:
file.tmp
aaa
ee
ff
file.sort
grrg
hhyj
zfe"
rg
Donc je veux faire:
file.tmp (on y touche pas)
aaa
ee
ff
file.sort
aaa
ee
ff -
pour l'instant je suis là:
Il faut que je lise chaque ligne du fichier.sort (qui est le fichier à traiter) et je le compare a toutes les lignes de mon fichier de conf qui est $conf_file:
open (FICANA, "+>$file_analyse");
pen (FICCONF, "$conf_file");
while($analyse=<FICANA>){
# On test $file.analyse pour savoir s'il ne contient pas les lignes $line
# et on met dans $file.tmp les éléments de $file.analyse différents de $line
while($ligne=<FICCONF>){
if($analyse!=~ m/\$ligne/){ -
-
-
patience ;-)
c'est promis pour ce soir ;-)) -
- 1
- 2
- 3
- 4
- 5