question

question - Perl - Programmation

Marsh Posté le 19-08-2015 à 23:23:15    

Salut  
J'ai une Question:
je possede 2 codes nommons les code1 et code2
j'esxecute code1 et il me retourne par-exemple:
papa
titi
toto
tata
tutu
pipi
 
j'execute code2 il me retourne par-exemple:
titi  
toto
pipi
 
j'explique le procede es qu'il est possible qu'un code2 va dans le dossier ou code1 a stocke son renvoi chercher un certain nombre de  
fichiers donc il trouve que ceux ci remplice les conditions donc il cherche les ouvrent(sans toute fois efface ce qui etait deja ecrit dans le fichier) et puis  
ecrit aussi des donnes sur ces fichiers et puis le revoit a son tour.
dans un autre dossier.
c'est jute pour savoir si cela st possible , car j'ai un probleme donc je pense que cela peut etres resolu de la sorte.
 
Merci bien.

Reply

Marsh Posté le 19-08-2015 à 23:23:15   

Reply

Marsh Posté le 20-08-2015 à 01:24:53    

C'est possible.
Mais souvent superflu.
Si on a un script A qui écrit dans des fichiers, et que ces fichiers ne servent qu'a être exploités par un Script B, et à rien d'autre, ça veut dire, sauf cas très particulier, qu'on pourrait avoir un script C qui fait tout d'un coup et de manière plus efficace.
En particulier, au lieu d'écrire dans un fichier, on pourrait donc écrire dans une variable de type chaîne de caractères, et lire le contenu de cette variable ensuite.
 
A+,


Message édité par gilou le 20-08-2015 à 01:27:03

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-08-2015 à 11:57:55    

Salut Gilou
c'etait pour faire allusion au probleme que je te presentais la derniere fois lorque je voulais que 2 codes ecrivent dans le meme fichier, car je pense que c'est pour cette option que je vais me penche car je ne connais pas d'autre moyens.  ou alors peus tu avoir une autre Idee? plus facile.

Reply

Marsh Posté le 20-08-2015 à 14:02:45    

Comme je t'ai dit, puisque tu as un code B qui utilise les résultats d'un code A, pourquoi ne fait tu pas un code unique? S'il n'y a pas de raison spéciale, autant faire un seul script.
 
Si c'est pour écrire les résultats du code A, suffit de faire des  
push @resultat "truc a ecrire\n";
au lieu de faire
print $fh "truc a ecrire\n";
et tout est écrit dans une liste, qu'on peut passer a l'autre code
 
et a la lecture par le code B, faire un
while ( @resultat )
au lieu d'un  
while (<$fh> )
 
et le tour est joué.
 
A priori en perl, on évite les fichiers temporaires, qui sont très inefficaces (sauf cas de limitation en mémoire). On n'écrit dans des fichiers que les fichiers finaux.
 
A+,

Message cité 1 fois
Message édité par gilou le 20-08-2015 à 14:04:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-08-2015 à 23:41:40    

j'ai edite ma question, peut etre celle ci tu pourra m'aider merci d'avance, en voici le code
 

Code :


 
 le code B (deuxieme) traite un DATA2.csv et ecrit dans des fichiers, car dans le DATA2.csv les noms par exmple
DPA01 DPA02 DPA03 revient plusieurs fois en avec les memes donnes il les reecrit dans le meme fichier plusieurs fois
et au finisch on a comme l'inpression qu'il ne l'a fait qu'une fois, maintenant j'aimerai qu'il ecrive les resultats juste une fois car les noms reviennent a chaque fois avec les memes donnes donc l'ecrire juste une fois et ignorer tout ce suivra, et passe au nom suivant soit DPA02 faire la meme chose ecrire les donnes une fois et ignore tous ceux qui suivrent.
 
es ce que tu peus m'aider a ce niveau? merci bien


Message édité par Henri772 le 26-08-2015 à 00:47:17
Reply

Marsh Posté le 21-08-2015 à 11:32:00    

gilou a écrit :

Comme je t'ai dit, puisque tu as un code B qui utilise les résultats d'un code A, pourquoi ne fait tu pas un code unique? S'il n'y a pas de raison spéciale, autant faire un seul script.
 
Si c'est pour écrire les résultats du code A, suffit de faire des  
push @resultat "truc a ecrire\n";
au lieu de faire
print $fh "truc a ecrire\n";
et tout est écrit dans une liste, qu'on peut passer a l'autre code
 
et a la lecture par le code B, faire un
while ( @resultat )
au lieu d'un  
while (<$fh> )
 
et le tour est joué.
 
A priori en perl, on évite les fichiers temporaires, qui sont très inefficaces (sauf cas de limitation en mémoire). On n'écrit dans des fichiers que les fichiers finaux.
 
A+,


 
je crois qu'a ce niveau il ya probleme lorsque tu ecris
 
while ( @resultat )
au lieu d'un  
while (<$fh> )
 
le fichier donc traite le code A est diffenrent de celu donc traite le code B, donc en lisant juste @resultat  il faudre aussi qu'il traite le fichier donc sense le faire.

Reply

Marsh Posté le 23-08-2015 à 17:00:25    

Salut Gilou j#ai eu a essayer ta propositon ca na pas malheureusement pas marche je parle de ceci
 
Si c'est pour écrire les résultats du code A, suffit de faire des  
push @resultat "truc a ecrire\n";
au lieu de faire
print $fh "truc a ecrire\n";
et tout est écrit dans une liste, qu'on peut passer a l'autre code
 
et a la lecture par le code B, faire un
while ( @resultat )
au lieu d'un  
while (<$fh> )
 
et le tour est joué.


Message édité par Henri772 le 23-08-2015 à 17:01:00
Reply

Marsh Posté le 23-08-2015 à 18:31:32    

Oui, c'est un foreach ( @resultat ) et non pas un while qu'il faut faire, bien sur, si c'est une boucle sur un array non modifié.
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my @pseudofile;
  7.  
  8. sub scriptA {
  9.  my $linenum = 0;
  10.  # on écrit un nombre aléatoires de lignes
  11.  foreach (0..(int(rand(10)))) {
  12.    push @pseudofile, "Ligne ".++$linenum."\n";
  13.  }
  14. }
  15.  
  16. sub scriptB {
  17.  # on lit les données écrites et on les envoies à la console
  18.  foreach (@pseudofile) {
  19.    print "$_";
  20.  }
  21. }
  22.  
  23. scriptA();
  24. scriptB();


 
Il y a aussi la variante

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my $memoryfile;
  7.  
  8. sub scriptA {
  9.  my $linenum = 0;
  10.  open my $fh, '>', \$memoryfile;
  11.  # on écrit un nombre aléatoires de lignes
  12.  foreach (0..(int(rand(10)))) {
  13.    print $fh "Ligne ".++$linenum."\n";
  14.  }
  15.  close $fh;
  16. }
  17.  
  18. sub scriptB {
  19.  open my $fh, '<', \$memoryfile;
  20.  # on lit les données écrites et on les envoies à la console
  21.  while (<$fh> ) {
  22.    print "$_";
  23.  }
  24.  close $fh;
  25. }
  26.  
  27. scriptA();
  28. scriptB();


 
A+,


Message édité par gilou le 23-08-2015 à 18:47:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-08-2015 à 00:13:39    

merci bien ,tu trouveras peut etre la question bête comment fonctionne ce code


Message édité par Henri772 le 24-08-2015 à 00:14:43
Reply

Marsh Posté le 24-08-2015 à 02:33:47    

Oui, je comprends pas ta question.
Le premier exemple utilise une liste et le second une zone mémoire accédée comme si c'était un fichier.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-08-2015 à 02:33:47   

Reply

Marsh Posté le 24-08-2015 à 07:34:42    

la question est de svoir si je voulais applique l'un des exemple a mon cas precis comment dois je m'y prendre.
je dois cree un dossier sur C dans le quel je je mets le script A et B et maintenant dans perl command line que dois je tape?
 
 
salut  
que dois je change dans mon regex de maniere a ce que les valeurs 0 soit considere
 
sub clean {    
    my $string = shift;
    $string =~ s/^\s+//;
    $string =~ s/\s+$//;
    return $string;
}


Message édité par Henri772 le 24-08-2015 à 13:33:29
Reply

Marsh Posté le 24-08-2015 à 16:19:20    

Ça veut dire quoi, "que les valeurs 0 soit considere" ?
Sans plus d'explication, ça veut rien dire.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-08-2015 à 19:11:24    

Merci bien a ta reaction j'ai oublie de mensionner que j'e l'ai resolu.
je sais pas comment je dois applique l'un des 2 codes a mon probleme
 
d'apres toi pourquoi ce script ne me retourne aucun resultat ($FileResult_0)
 
 

Code :
  1. #!/usr/local/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use XML::Twig; 
  5. use POSIX qw(strftime);
  6.                  
  7. my $date_1 = strftime "%Y%m%d %H:%M:%S", localtime;
  8. my $file1 = $ARGV[0] || die 'No file1';   
  9. my $file2 = $ARGV[1] || die 'No file2'; 
  10. my $FileResult_0 = $ARGV[2] || 'defaultwerte.html';
  11. my $FileResult_1 = $ARGV[3] || 'defaultwerte.csv';
  12. open( my $FhResult_0, '>>', $FileResult_0 ) or die("Unable to open file $FileResult_0\n$!" );
  13. open( my $FhResult_1, '>', $FileResult_1 ) or die("Unable to open file $FileResult_1\n$!" );
  14. print $FhResult_1 $date_1, "\n";
  15. my $twig1= XML::Twig->new(   
  16.         twig_handlers => {   
  17.                 'Parameter' => sub {
  18.                        
  19.                              
  20.                         my $attr_name = $_->{'att'}->{'name'};
  21.                         print $FhResult_1 $attr_name . ", ";
  22.                 },
  23.         },
  24. );
  25. print $FhResult_1( (split('_', $file1,2))[0] . ', ' );
  26. $twig1->parsefile($file1);
  27. my $twig2= XML::Twig->new(   
  28.         twig_handlers => {
  29.                 'Parameter' => sub {
  30.                        
  31.                         my $attr_value = $_->{'att'}->{'value'} // '';  
  32.                         print $FhResult_1 $attr_value . ", ";
  33.                 },
  34.         },
  35. );
  36. print $FhResult_1( (split('_', "\n$file2",2))[0] . ', ' );
  37. $twig2->parsefile($file2);
  38. my $twig= XML::Twig->new
  39.         twig_handlers => {
  40.                 'Parameter' => sub {
  41.      my $attr_name  = $_->{'att'}->{'name'}  // '';    
  42.                         my $attr_value = $_->{'att'}->{'value'} // '';  
  43.                         print $FhResult_0 "\n <tr><td>$attr_name</td><td>$attr_value</td></tr>";
  44.                 },
  45.         },
  46. );
  47. print $FhResult_0 ( (split('_', "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">
  48. <html>
  49. <head>
  50.    <title>PARAMETERS</title>
  51.    <meta charset=\"UTF-8\"/>
  52.    <link href=\"defaultwerte.css\" type=\"text/css\" rel=\"stylesheet\"/>
  53. </head>
  54. <body>\n<div id=\"c1\">\n<table>\n<tr><th>$file1:",2))[0] . "</th></tr>" );
  55. $twig->parsefile($file2);
  56. print $FhResult_0 "\n<table>\n</body>\n</html>";
  57. use strict;
  58. use warnings;
  59. use Text::CSV;
  60. my $csv = Text::CSV->new;
  61. open my $csv_file, "<", "DATA2.csv" or die "Can't open CSV file: $!\n";
  62. while (my $row = $csv->getline($csv_file)) {
  63.    
  64.     my($significator_and_file) = clean($row->[0]);
  65.     my ($significator, $file) = split /\s+/, $significator_and_file;
  66.     next unless $significator and $significator eq 'false';
  67.     open (my $FhResult_0, ">>", "$file.html" ) or die "Can't open per-line file $file: $!\n";
  68.    
  69.     shift @$row;
  70. print $FhResult_0 "<table>\n<tr><th>$file:</th></tr>\n";
  71. for my $i(map {clean($_)} @$row) {   
  72. if ($i){
  73. my $d = "<tr><td>$i</td></tr>\n";
  74. chomp $i;
  75.     print $FhResult_0 $d;
  76.  }
  77. }
  78.     print $FhResult_0 "</table>\n</body>\n</html>";
  79.     close $FhResult_0;
  80. }
  81. sub clean {   
  82.    my $string = shift;
  83.     $string =~ /\s*,\s*/;
  84.     $string =~ s/\s+$//;
  85.     return $string;
  86. }


Message édité par Henri772 le 24-08-2015 à 19:53:26
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed