[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!!!
- [PERL]- traduire du shell en perl
- Classic shell - Télécharger - Personnalisation
- Ecouteurs denon perl - Accueil - Audio
- Comment traduire une page internet - Guide
- Traduire photo - Guide
- Active perl - Télécharger - Édition & Programmation
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.
#!/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__
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 questionvu 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
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
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
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é ;-))
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
que veut tu faire exactement?
montre un exemple.
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
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/){
- 1
- 2
- 3
- 4
- 5