[PERL]- traduire du shell en perl

tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   -  
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

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!!!
A voir également:

90 réponses

tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
tu compare la ligne de .analyse en question (puis tu fait pareil pour tte les autres: simple boucle) avec TOUTES celles de .conf et tu test.
bref je crois que je ne vais pas réussir a t expliquer mon probleme :(
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
tu compare la ligne de .analyse en question (puis tu fait pareil pour tte les autres: simple boucle) avec TOUTES celles de .conf et tu test.

c'est exactement ce que fait le script que je t'ai donnée
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
je t'ai envoyé un mail
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
je vais regarder sa
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
viens sur msn
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
merci sa a l air de très bien fonctionner d'après ce que tu m'a envoyer!!!
merci beaucoup!
je vais tester tout sa demain
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
salut,

cette ligne me bloque le script a l execution:

$e=~/${x}.*$y/;

est tu sur de la syntaxe?

le code:
         open CONF,"$conf_file"
	   or die "E/S : $!\n";
	open ANALYSE,"$file_analyse"
	   or die "E/S : $!\n";
	open TMP,">$file_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;
	}
	close(CONF);
	close(ANALYSE);
	close(TMP);
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
c'est bon j'ai enlever cette ligne: $y=~ s/^\s*(.*)/$1/; et ca marche!
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

en fait cette ligne je l'ai mis puisque tu avais d'espaces après |
donc c'était juste une sécurité en plus

chez ça marche -> je te l'ai dit qu'on ne teste pas les même fichiers, mais tu ne veux pas me croire

quand je teste tes soit disant fichier je dois faire un copier/coller
en ce cas c'est possible de copier aussi des caractères non imprimables qui n'existent pas

mais bon, tant mieux que ça marche
j'espère que t'es content ;-)

0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
je vais faire des tests complémentaires mais pour l'instant sa marche!
En tous cas merci pour tout lami20j!!
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
petite question:
my ($x,$y)=split /\|/,$_;

a quoi correspond le $_?
0
blux Messages postés 27166 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Salut,

C'est la variable fourre-tout de Perl...

Si tu fais print pour afficher quelque chose sans mettre de variable, Perl affichera le contenu de $_

La plupart des opérations en Perl utilisent cette variable en usage interne, mais elle est aussi accessible en externe (pour l'utilisateur). Il ne faut cependant pas trop compter dessus, car elle est susceptible d'être modifiée à tout moment...
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
mais ici que vaut elle?
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;
	}
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,


cette partie
print TMP $e unless grep
	  {
 	    if($_=~/\|/){
	      my ($x,$y)=split /\|/,$_;
	      $y=~ s/^\s*(.*)/$1/;
	      $e=~ /${x}.*$y/;
 	    }else{
	      $e=~/$_/;
	    }
	  } @conf;

j'aurais pu l'écrire (mais pour des raions de visibilité j'ai préféré le 1ère version ;-)
print TMP $e unless grep {if($_=~/\|/){my ($x,$y)=split /\|/,$_;$y=~ s/^\s*(.*)/$1/;$e=~ /${x}.*$y/;}else{$e=~/$_/;}} @conf;

et si tu consulte la doc de la fonction grep http://perl.mines-albi.fr/DocFr/perlfunc.html#item_grep tu comprendras mieux

Dans ce cas $_ , représente les éléments de @conf

Il ne faut cependant pas trop compter dessus, car elle est susceptible d'être modifiée à tout moment

On peut toujours compter sur $_ , mais il faut être rigureaux en écrivant le code

C'est la raison pour laquelle dans la boucle while(my $e=<ANALYSE>){ j'utilise $e
A savoir que $_ est utilisé aussi pour des raisons de paresse ;-))
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
merci pour cette bellle analyse!!
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
est il possible dans ce sccript de rajouter dans un fichier .debug la ligne qui a permis d'enlever la ligne de .analyse. Par là je veux dire par exemple que si on a :
.conf
ntpd: listening
ntpd: complete installation

.analyse
ntpd: listening on interface
allo: bonjour
lami20j: mr perl

.tmp
allo: bonjour
lami20j: mr perl

et de mettre par exemple dans un .debug ici:
ntpd: listening on interface retirée par ntpd: listening du fichier .conf

qui aurait un epetite idée. moi jaa i essayer:
	my $d;
	open CONF,"$confFile" or die "E/S : $!\n";
	open ANALYSE,"$fileAnalyse" or die "E/S : $!\n";
	open TMP,">$fileTmp" or die "E/S : $!\n";
	open DEBUG,">>$fileDebug" or die "E/S : $!\n";
	
	while (my $c=<CONF>){
		while(my $e=<ANALYSE>){
		  if($c=~/\|/){
		      my ($x,$y)=split /\|/,$c;
		      if($e=~ /$x.*$y/){
			      print TMP $e;
		      }else{		      
		      $d="$e enlevé par $c";
		      print DEBUG $d;
	      	        }
	             }
	             elsif($e=~/$c/){
		           print TMP $e;
	             }
                      else{
                                     $d="$e enlevé par $c";
	                     print DEBUG $d;
                             }

	           }
	      }
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
mais le fichier .debug ne se rempli pas
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
une idée??
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
autre idée a la manière de lami20j:

open CONF,"$confFile" or die "E/S : $!\n";
	open ANALYSE,"$fileAnalyse" or die "E/S : $!\n";
	open TMP,">$fileTmp" or die "E/S : $!\n";
	open DEBUG,">>$fileDebug" or die "E/S : $!\n";
	
	my @conf=<CONF>;
	chomp @conf;
	while(my $e=<ANALYSE>){
	  print TMP $e unless grep
	  {
 	    if($_=~/\|/){
	      my ($x,$y)=split /\|/,$_;
	      $e=~ /$x.*$y/;
	      if($e=~ /$x.*$y/){
		      print DEBUG "$e:$_\n";
		   }
 	    }else{
	      $e=~/$_/;
	      if($e=~/$_/){
		      print DEBUG "$e:$_\n";
	      }
	    }
	  } @conf;

	}


mais cela ne marche pas tout le temps!!
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
#!/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";
open DEBUG,">debug.log"        or die "E/S : $!\n";

my @conf=<CONF>;
chomp @conf;
while(my $e=<ANALYSE>){
  if( grep {
             if($_=~/\|/){
               my ($x,$y)=split /\|/,$_;
               $y=~s/^\s*(.*)/$1/;
               $e=~/${x}.*$y/;
             }else{
               $e=~/$_/;
             }
           } @conf){
          print DEBUG $e;
  }else{
          print TMP $e;
  }
}
__END__
0
tonixm Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   4
 
merci lami20j!!!

par curiosité: as tu tester cette solution??
0