[PERL]- traduire du shell en perl

Fermé
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 - 9 avril 2008 à 13:39
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 - 22 avril 2008 à 15:29
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
12 avril 2008 à 22:30
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 avril 2008 à 22:36
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 avril 2008 à 22:41
je t'ai envoyé un mail
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
12 avril 2008 à 22:43
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
12 avril 2008 à 23:03
viens sur msn
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
13 avril 2008 à 09:23
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
14 avril 2008 à 09:18
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
14 avril 2008 à 09:57
c'est bon j'ai enlever cette ligne: $y=~ s/^\s*(.*)/$1/; et ca marche!
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
14 avril 2008 à 10:09
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
14 avril 2008 à 10:17
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
21 avril 2008 à 09:15
petite question:
my ($x,$y)=split /\|/,$_;

a quoi correspond le $_?
0
blux Messages postés 26498 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 28 novembre 2024 3 317
21 avril 2008 à 09:33
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
21 avril 2008 à 09:35
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
21 avril 2008 à 11:37
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
21 avril 2008 à 13:44
merci pour cette bellle analyse!!
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
21 avril 2008 à 13:58
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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
21 avril 2008 à 13:58
mais le fichier .debug ne se rempli pas
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
21 avril 2008 à 15:12
une idée??
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
21 avril 2008 à 17:29
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
21 avril 2008 à 18:18
#!/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 mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
21 avril 2008 à 18:25
merci lami20j!!!

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