[Perl ou PHP] Besoin d'un exemple tout bête

Fermé
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006 - 27 mars 2006 à 09:56
 nath - 23 janv. 2007 à 16:48
Bonjour,

J'aimerais un renseignement s'il vous plait:

Il faut que j'ecrive un petit script (ou programme) sous unix et je
n'ai encore jamais fait ca..

ce que j'ai a faire, c'est ca: creer un graphique de type XY (abcisse-ordonnee) a partir de donnees d'un fichier texte et afficher ce graphique dans netscape (netscape navigator version 4.78).
Et tout ca dans une procedure automatique.

On m'a dit que les languages php et perl étaient adaptés à mon cas. Dans ce cas, quel est la plus facile: php ou perl ?

Mais concretement, quand je suis sous unix, qu'est ce que je dois faire pour lancer un programme (perl ou php) ? Je l'écris dans un fichier texte ou un fichier executable ? Quelle extension je dois donner à ce fichier dans ce cas? Et comment je l'execute ? Vous auriez pas un exemple tout con, genre juste l'affichage d'un message ou la somme 2+2=4 pour que je puisse voir comment procéder pour executer un tel programme ?


PS: voici un exemple de fichier texte dans lequel sont contenues mes donnees:

POINT ID. TYPE T1 T2 T3 R1 R2 R3
1 G 1.599571E+01 1.185148E-02 -3.111541E+00 1.784951E-06 5.286219E-02 -3.340712E-06
2 G 2.303846E+00 1.238950E-02 -1.913684E+00 1.784951E-06 5.286219E-02 -3.340712E-06
1000 G 1.009300E-03 -1.461770E-03 -8.895236E-02 -1.380486E-02 1.121588E-03 0.0
1001 G 6.655139E-04 -1.269913E-03 -1.202470E-02 -8.149052E-03 1.912397E-03 0.0
1002 G 2.128328E-04 -4.430452E-04 2.143617E-02 9.356764E-04 -1.131274E-03 0.0
1003 G 1.528846E-04 -3.164306E-04 1.279018E-02 1.256070E-03 -7.879398E-04 0.0
1004 G 4.770843E-04 -1.147985E-03 2.830649E-02 -3.521185E-03 -6.181516E-04 0.0
1005 G 2.695279E-04 -3.397622E-04 -1.185465E-02 -1.379297E-04 -1.666789E-03 0.0
1006 G 5.318802E-03 -1.288805E-02 1.703259E-01 3.963486E-02 2.937418E-02 0.0
1007 G 3.142439E-03 -5.341556E-03 5.803642E-02 1.815232E-02 1.094855E-02 0.0
1008 G 1.822350E-04 3.866597E-04 1.790608E-02 -1.606418E-03 -7.047455E-04 0.0


Et donc, par exemple, j'aimerai faire le graphique suivant contenant 3 points:
les points 1002, 1005 et 1006
leur abcisses respectives se trouvent dans la colonne T1, leurs ordonnees dans la colonne T3.
Et afficher ce graphique (avec legende, titre etc...) dans netscape..

merci.
Miguel
A voir également:

45 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
27 mars 2006 à 11:35
Réponses données dans le forum "Linux"


# < 1 > - Novice en programmation cherche aide.
193.49.146.xxx - titan.info.univ-angers.fr Fermé dans le Forum Linux/Unix par jipicy le 27/03/2006 à 11:31Ajouté par mamiemando (27/03/2006 à 11:04 GMT+2)

La il faut que tu réflechisses à la manière dont tu vas générer ce graphique, sachant qu'il y a plein de méthodes :

Phase 1-2
Là il faut choisir ton langage. Personnellemment j'aime bien le python mais ça se fait aussi en ruby ou en perl... Eviter le bash ou le shell.

On pourrait même imaginer que tu le fasses direct en PHP si par exemple l'utilisateur upload ses points sur un site, et que tu lui renvoie le graphe... Mais cela suppose que tu aies un serveur apache d'installé.

Phase 3-5
1) génération d'un fichier SVG (mais requiert l'installation d'un plugin sur le navigateur client), graphe vectoriel
2) utilisation de gd
3) utilisation de gnuplot (à mon avis la plus simple des trois méthodes si tu utilises un script)

Phase 6-7
Si tu as fait un script, il ne reste plus qu'à appeler le navigateur en passant en paramètre l'url de la page générée, qui aura grosso modo cette forme :
<html>
<body>
Mon joli graphe :
<img src="mon_joli_graphe.png">
</body>
</html>
Précise-nous ce que tu préfères pour chacunes de ces phases.

Bonne chance

[ Modérer ]
[ Alerter un modérateur ][ Autres messages de mamiemando ][ 193.49.146.xxx - titan.info.univ-angers.fr ]


# < 4 > - Novice en programmation cherche aide.
81.173.212.xxx - ... Fermé dans le Forum Linux/Unix par jipicy le 27/03/2006 à 11:31Ajouté par fifto (27/03/2006 à 11:27 GMT+2)

Merci mamiemando !!

Ben je vais essayer d'utiliser le perl.

pour la phase 3-5 je vais essayer d'utiliser gnuplot

Qu'entends-tu par "en passant en paramètre l'url de la page générée" s'il te plait ?

Bon merci ! maintenant, je vais m'y mettre ! Du moins tenter d'essayer hum hum...

Miguel
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
28 mars 2006 à 09:28
1) Lire les données, conserver ce que tu veux. Ca c'est la partie en perl qui lit ton fichier d'entrée, je te laisse faire ta sauce.

2) Générer les fichiers gnuplot. Dans ton cas tu en as deux : un fichier .dat, contenant les points, et un fichier .gnu, qui contient les instructions pour gnuplot, notamment tout ce qui est mise en forme et appel au fichier .dat. Exemple (source http://people.duke.edu/~hpgavin/gnuplot.html):

force.dat
      0.000              0              0    
      0.001            104             51
      0.002            202            101
      0.003            298            148
      0.0031           290            149
      0.004            289            201
      0.0041           291            209
      0.005            310            250
      0.010            311            260
      0.020            280            240

force.gnu
      # Gnuplot script file for plotting data in file "force.dat"
      # This file is called   force.p
      set   autoscale                        # scale axes automatically
      unset log                              # remove any log-scaling
      unset label                            # remove any previous labels
      set xtic auto                          # set xtics automatically
      set ytic auto                          # set ytics automatically
      set title "Force Deflection Data for a Beam and a Column"
      set xlabel "Deflection (meters)"
      set ylabel "Force (kN)"
      set key 0.01,100
      set label "Yield Point" at 0.003,260
      set arrow from 0.0028,250 to 0.003,280
      set xr [0.0:0.022]
      set yr [0:325]
      plot    "force.dat" using 1:2 title \'Column\' with linespoints , \\
            "force.dat" using 1:3 title \'Beam\' with points

3) Il ne reste plus qu\'à appeler gnuplot. De deux choses l'une, soit tu dessines dans une fenêtre (pas besoin du coup de navigateur !), soit dans un fichier dessin (par exemple un png) en vue de l\'intégrer dans un fichier html. C'est le rôle de la fonction set terminal dans le fichier .gnu :
set terminal png
set output plop.png

Plus de détails ici :
https://fr.wikipedia.org/wiki/Gnuplot

4) A partir de là tu peux fermer les fichiers .dat et .gnu, ils sont terminés. Supposons que tu veuilles générer un png, il faut maintenant appeler gnuplot depuis ton script perl.
Tu peux te baser sur :
http://www.hep.ucl.ac.uk/~ytl/misc/gnuplot/gnuplot_01.html
Ca consisterait à taper dans un terminal :
gnuplot force.gnu


5) Il ne reste plus qu'à générer le fichier html come indiqué dans le post précédent, fermer le fichier html, et appeler le navigateur :
firefox fichier.html

Bonne chance
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
28 mars 2006 à 10:43
tu sais ou je peux telecharger gnuplot pour unix s'il te plait ?
Et tu sais comment on l'installe ?

J'ai beau chercher sur le net, rien de très précis...

Miguel
0
gnuplot est normalement installé sur toutes les distribution linux par defaut
pour le tester tape gnuplot dans une console
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 567
28 mars 2006 à 13:18
Salut à tous,

Mais concretement, quand je suis sous unix, qu'est ce que je dois faire pour lancer un programme (perl ou php) ? Je l'écris dans un fichier texte ou un fichier executable ? Quelle extension je dois donner à ce fichier dans ce cas? Et comment je l'execute ? Vous auriez pas un exemple tout con, genre juste l'affichage d'un message ou la somme 2+2=4 pour que je puisse voir comment procéder pour executer un tel programme ?

Je te parle de Perl.

Voilà un exemple.

1. Tu dois editer un fichier dont tu l'appel mon_script

Dédans tu écrit

#! /usr/bin/perl
# il faut taper la commande whereis perl pour localiser perl sur ton pc
# si perl n'est pas dans /usr/bin/perl alors il faut changer

# ce le chemin vers l'interpreteur perl

use warnings;
use strict;

my ($r1,$r2) = (2,4);

my $sum = $r1 +$r2;

print "La somme $r1 + $r2 = $sum\n";


2. tu enregistres le fichier (tu peux utiliser l'extension .pl)

3. pour l'exécuter tu as 2 posibités

- tu le rend exe avech chmod -v 0755 mon_script
tu peux l'exécuter avec /chemin/vers/mon_script

- tu peux utiliser la commande perl
perl /chemin/vers/mon_script

Si tu ne sais pas je pourrai faire ta sauce en Perl, il faut seulement me dire que veut tu extraire de ton fichier.

Donc le fichier de depart et les les données que tu veux extraire.


lami20j

P.S.

http://www.gnuplot.info/ regarde le lien download
http://gershwin.ens.fr/vdaniel/Doc-Locale//Outils-Gnu-Linux/Gnuplot/Doc-French/tr...
http://www.info.univ-angers.fr/~gh/tuteurs/tutgnuplot.htm
0

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

Posez votre question
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
28 mars 2006 à 14:02
salut lamy20j !

Merci !

Bon voilà à quoi ressemble le fichier de départ fichier1.txt, sachant que ce qui m'interesse ce sont les données en dessous des colonnes T1 et T3:

------------ début fichier1.txt ---------------------
okokokok
,,,
....
e f g
100 1 2 3
-*----OLOAD
D I S P L A C E M E N T V E C T O R
POINT ID. TYPE T1 T2 T3
1048 G 5.3E-04 -9.8E-03 2.34E-02
1049 G 1.74E-05 1.3E-05 2.305E-03
1050 G -4.9E-05 -4.27E-05 -1.192E-02
----------
*********
commentaires
SUBCASE
D I S P L A C E M E N T V E C T O R
POINT ID. TYPE T1 T2 T3
201 G 5.3E-04 -9.8E-03 2.34E-02
202 G 2.78E-05 1.3E-05 2.99E-03
305 G -4.9E-05 -4.27E-05 -1.192E-02
1 * * * END OF JOB * * *
------------------- fin fichier1.txt ---------------------------



Les données qui m'interessent, ce sont les données en dessous de chaque "D I S P L A C E M E N T V E C T O R". Ce sera le mot clé je suppose pour detecter qu'on commence à lire un tableau avec les valeurs.
Et donc, j'aimerais que l'utilisateur puisse choisir les ID. des points qui l'interessent. Si il rentre par exemple 1049 202 et 305, il faudrait que le fichier texte cible, c'est à dire fichier2.txt, ait cette tronche là:



---------------------- début fichier2.txt ---------------------
# T1 T3
1.74E-05 2.305E-03
2.78E-05 2.99E-03
-4.9E-05 -1.192E-02
----------------------- fin fichier2.txt -----------------------

En remarquant que seules les données correspondant aux colonnes T1 et T3 m'interessent.

Si t'arrives à faire ca, tu me sauves la vie !!!
Miguel
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 567
28 mars 2006 à 14:37
Re,

oui je peux le faire, mais ça sera pour ce soir.

Mets ici ton fichier https://www.cjoint.com/ et donne le lien.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
28 mars 2006 à 14:41
Salut,

"lami20j" t'as déjà donné un début de réponse dans ton autre post, là plus précisément :
https://forums.commentcamarche.net/forum/affich-2165682-perl-extraction-de-donnees-d-un-fichier-text#5

ainsi que moi (mais dans un autre langage, le bash, propre à tous les Unix) :
https://forums.commentcamarche.net/forum/affich-2165682-perl-extraction-de-donnees-d-un-fichier-text#4

Le même script, mais plus adapté à ton problème (3 valeurs + le nom du fichier passé en paramètres) :
[jp@MDK tmpfs]$ cat file.txt
okokokok
,,,
....
e f g
100 1 2 3
-*----OLOAD
D I S P L A C E M E N T V E C T O R
POINT ID. TYPE T1 T2 T3
1048 G 5.3E-04 -9.8E-03 2.34E-02
1049 G 1.74E-05 1.3E-05 2.305E-03
1050 G -4.9E-05 -4.27E-05 -1.192E-02
----------
*********
commentaires
SUBCASE
D I S P L A C E M E N T V E C T O R
POINT ID. TYPE T1 T2 T3
201 G 5.3E-04 -9.8E-03 2.34E-02
202 G 2.78E-05 1.3E-05 2.99E-03
305 G -4.9E-05 -4.27E-05 -1.192E-02
1 * * * END OF JOB * * *


[jp@MDK tmpfs]$ cat batch.sh
#! /bin/bash

egrep "$1|$2|$3" < $4 | awk '{ print $3" "$5 }'>> fichier.txt

[jp@MDK tmpfs]$ sh batch.sh 1049 202 305 file.txt

[jp@MDK tmpfs]$ cat fichier.txt
1.74E-05 2.305E-03
2.78E-05 2.99E-03
-4.9E-05 -1.192E-02

[jp@MDK tmpfs]$
Par contre il serait bien de savoir si les paramètres (valeurs) seront toujours constantes (au nombre de 3) ou variables ?
Et si le fichier de référence est lui aussi constant ?
Et si dans le fichier de destination, les valeurs doivent être écrasées ou implémentées ?

;-))
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
28 mars 2006 à 15:05
voilà Lami !
Le fichier1.txt se trouve là:
https://www.cjoint.com/?dCo0QJ4wvr

Pour répondre à jipicy, les valeurs varient en fonction du calcul effectué. C'est à dire que tous les fichiers texte de référence seront différents. La structure reste cependant la même, c'est à dire :

D I S P L A C E M E N T V E C T O R
POINT ID. TYPE T1 T2 T3


les valeurs en dessous changent....


PAr contre, il y a plus que 3 colonnes. Ca se limite pas à T1 T2 et T3 mais c'Est toujours de ce type là :


D I S P L A C E M E N T V E C T O R

POINT ID. TYPE T1 T2 T3 R1 R2 R3
1 G 1.599571E+01 1.185148E-02 -3.111541E+00 1.784951E-06 5.286219E-02 -3.340712E-06
2 G 2.303846E+00 1.238950E-02 -1.913684E+00 1.784951E-06 5.286219E-02 -3.340712E-06
1000 G 1.009300E-03 -1.461770E-03 -8.895236E-02 -1.380486E-02 1.121588E-03 0.0

mais moi ce qui m'interesse c'est juste les valeurs de deux colonnes, comme par exemple T1 et T2 pour tracer un graphique.

Il faut en fait que le programme demande à l'utilisateur quelles valeurs il a besoin et pour quels points. Le nb de valeurs c'est toujours 2, c'est à dire T1 et T3, ou T2 et R1. Par contre, le nb de points peut varier. de 1 à l'infini. C'est à l'utilisateur de préciser quand c'est fini. Genre avec une question qui s'affiche "rajouter des points ? oui / non "

Pour ce qui est du fichier de destination, fichier2.txt, on peut faire tout de qu'on veut du moment qu'il contienne les valeurs choisies et que ces valeurs soient dans deux colonnes, par exemple:

# T1 T3
1.599571E+01 -3.111541E+00
1.009300E-03 -8.895236E-02


de manière À ce que je puisse appeler ce fichier avec gnuplot pour pouvoir tracer une courbe en deux dimensions.

Voili voilou
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
28 mars 2006 à 15:07
au fait jipicy, le script que t'as écrit c'Est du batch ? c'Est pas du perl ?

(Peut etre que je suis en train de dire une connerie là, vu mon niveau...)

Ce qui est sûr, c'Est que je dois utiliser du perl.
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 567
28 mars 2006 à 16:36
Re,

tu ne dit pas des conneries. J'attends ton fichier. A ce soir.
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
28 mars 2006 à 16:40
voilà Lami !
Le fichier1.txt se trouve là:
https://www.cjoint.com/?dCo0QJ4wvr
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 567
28 mars 2006 à 21:24
Re,

teste et dit si tu as des erreurs.
#! /usr/bin/perl
#
use warnings;
use strict;

@ARGV = qw (/home/lami/fifto_joint);
my $q = qr /\b-?[1-9]\.\d+e(?:\+|-)\d\d\b/i;
my $e = 'o';
my (@elem,@fin);

print "Choisissez T1T3 ou T2R1 : ";
chomp(my $choix = <STDIN>);

while ( $e ne 'n'){
        print "Entrez un point [ n pour quitter ]: ";
        chomp( $e = <STDIN>);
        push @elem,$e;
}

while (<>) {
        if (/\d{1,4}.*/ && /$q\s*$q\s*$q/){
                if ($choix eq 'T1T3'){
                        s/(.*)/join " ",((split " ",$1)[0,2,4])/e;
                }
                elsif ($choix eq 'T2R1') {
                        s/(.*)/join " ",((split " ",$1)[0,3,5])/e;
                }
                push @fin,$_;
        }
}

$choix =~ s/(\w\d)(\w\d)/$1 $2/;
print "$choix\n";
foreach my $e (@elem) {
        foreach my $f(@fin){
                print substr($f,length($e) + 1) if $f =~ /^$e\s/;
        }
}
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 567
28 mars 2006 à 21:47
Re,

j'ai oublié d'envoyer le résultat vers un fichier (je l'ai affiché sur STDOUT).

Automatiquement on fichier sera créer avec le nom T1T3.txt ou T2R1.txt.

A savoir qu'il faut remplacer les parties de codes que tu vois en gras en fonction de ta configuration. C'est à dire il faut mettre en 1er le chemin vers le fichie en entrer et en 2ème le chemin vers le fichier en sortie.

Je n'ai pas mis de commentaires, si tu as besoin fait un signe.
Je n'ai pas crée un gestionnaire des erreurs.
#! /usr/bin/perl
#
use warnings;
use strict;

@ARGV = qw (/home/lami/fifto_joint);
my $q = qr /\b-?[1-9]\.\d+e(?:\+|-)\d\d\b/i;
my $e = 'o';
my (@elem,@fin);

print "Choisissez T1T3 ou T2R1 : ";
chomp(my $choix = <STDIN>);

open FIC_W, ">>","/home/lami/$choix.txt"
      or die "Impossible de créer le fichier : $!\n";

while ( $e ne 'n'){
        print "Entrez un point [ n pour quitter ]: ";
        chomp( $e = <STDIN>);
        push @elem,$e;
}

while (<>) {
        if (/\d{1,4}.*/ && /$q\s*$q\s*$q/){
                if ($choix eq 'T1T3'){
                        s/(.*)/join " ",((split " ",$1)[0,2,4])/e;
                }
                elsif ($choix eq 'T2R1') {
                        s/(.*)/join " ",((split " ",$1)[0,3,5])/e;
                }
                push @fin,$_;
        }
}

$choix =~ s/(\w\d)(\w\d)/$1 $2/;
print FIC_W "$choix\n";
foreach my $ee (@elem) {
        foreach my $f(@fin){
                print FIC_W substr($f,length($ee) + 1) if $f =~ /^$ee\s/;
        }
}
P.S. Signale les erreurs s'il te plaît. Merci.
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
29 mars 2006 à 09:38
ok merci, je vais essayer de comprendre ce que t'as fait.

En attendant, je l'ai lancé, en devant retirer la ligne use warning car elle empeche de faire tourner le programme ici, et j'ai les messages d'erreur suivants :

TRNG_MUNC::essai2lami> ./script2.pl
Bareword "qr" not allowed while "strict subs" in use at ./script2.pl line 6.
Bareword "b" not allowed while "strict subs" in use at ./script2.pl line 6.
/[1-9]\.\d+e(/: unmatched () in regexp at ./script2.pl line 6.

Par contre, en retirant use strict en plus, j'obtiens ca:

TRNG_MUNC::essai2lami> ./script2.pl
/[1-9]\.\d+e(/: unmatched () in regexp at ./script2.pl line 5.


Voici donc le script (j'ai adapté les chemins)

#! /usr/bin/perl
#

@ARGV = qw (TRNG_MUNCH\MWESTEEL\Grafik_html_aus_f06_Datei\1\fichier1.txt);
my $q = qr /\b-?[1-9]\.\d+e(?:\+|-)\d\d\b/i;
my $e = 'o';
my (@elem,@fin);

print "Choisissez T1T3 ou T2R1 : ";
chomp(my $choix = <STDIN>);

open FIC_W, ">>","TRNG_MUNCH\MWESTEEL\Grafik_html_aus_f06_Datei\1\$choix.txt"
or die "Impossible de créer le fichier : $!\n";

while ( $e ne 'n'){
print "Entrez un point [ n pour quitter ]: ";
chomp( $e = <STDIN>);
push @elem,$e;
}

while (<>) {
if (/\d{1,4}.*/ && /$q\s*$q\s*$q/){
if ($choix eq 'T1T3'){
s/(.*)/join " ",((split " ",$1)[0,2,4])/e;
}
elsif ($choix eq 'T2R1') {
s/(.*)/join " ",((split " ",$1)[0,3,5])/e;
}
push @fin,$_;
}
}

$choix =~ s/(\w\d)(\w\d)/$1 $2/;
print FIC_W "$choix\n";
foreach my $ee (@elem) {
foreach my $f(@fin){
print FIC_W substr($f,length($ee) + 1) if $f =~ /^$ee\s/;
}
}
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
29 mars 2006 à 09:49
ouais, je veux bien que tu me mettes les commentaires parce que là je me casse la tête...

En tout cas c'Est sympa de ta part.
PS: C'était juste hier la grève en France ?
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
29 mars 2006 à 11:16
J'ai detecté une premiere erreur:

on écrit pas

open FIC_W, ">>","$choix.txt" or die "Impossible de créer le fichier : $!\n";

mais plutôt :

open(FIC_W,">>choix.txt") || die "Impossible de créer le fichier : $!\n";

J'ai testé, je confirme.

Bon je continue à déchiffrer...
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
29 mars 2006 à 11:49
En continuant À déchiffrer, j'ai réussi à identifier ce qui est correct à 100 % dans le programme :


print "Choisissez T1T3 ou T2R1 : ";
chomp(my $choix = <STDIN>);

open(FIC_W,">>choix.txt") || die "Impossible de créer le fichier : $!\n";

while ( $e ne 'n'){
print "Entrez un point [ n pour quitter ]: ";
chomp( $e = <STDIN>);
push @elem,$e;
}

while (<>) {

Bon c'Est qu'un début d'accord. Mais j'ai encore jamais programmé !
JE continue donc...

Ce qui pourrait bien me dépanner, c'est de comprendre ces deux lignes là :

@ARGV = qw (TRNG_MUNCH\MWESTEEL\Grafik_html_aus_f06_Datei\1\fichier1.txt);
my $q = qr /\b-?[1-9]\.\d+e(?:\+|-)\d\d\b/i;

Surtout la deuxieme... je trouve pas "qr" dans les tutoriaux.

Merci
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
29 mars 2006 à 12:55
Bon voilà, j'en suis là: en caractères gras c'est tout ce que je comprend pas:


#! /usr/bin/perl
#

@ARGV = qw (TRNG_MUNCH\MWESTEEL\Grafik_html_aus_f06_Datei\1\fichier1.txt);
my $q = qr /\b-?[1-9]\.\d+e(?:\+|-)\d\d\b/i;
my $e = 'o';
my (@elem,@fin);

print "Choisissez T1T3 ou T2R1 : ";
chomp(my $choix = <STDIN>);

open(FIC_W,">>choix.txt") || die "Impossible de créer le fichier : $!\n";

while ( $e ne 'n'){
print "Entrez un point [ n pour quitter ]: ";
chomp( $e = <STDIN>);
push @elem,$e;
}

while (<>) {
if (/\d{1,4}.*/ && /$q\s*$q\s*$q/){
if ($choix eq 'T1T3'){
s/(.*)/join " ",((split " ",$1)[0,2,4])/e;
}
elsif ($choix eq 'T2R1') {
s/(.*)/join " ",((split " ",$1)[0,3,5])/e;
}
push @fin,$_;
}
}

$choix =~ s/(\w\d)(\w\d)/$1 $2/;
print FIC_W "$choix\n";
foreach my $ee (@elem) {
foreach my $f(@fin){
print FIC_W substr($f,length($ee) + 1) if $f =~ /^$ee\s/;
}
}

Je continue...
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 567
29 mars 2006 à 13:10
Salut,

J'ai detecté une premiere erreur:

on écrit pas

open FIC_W, ">>","$choix.txt" or die "Impossible de créer le fichier : $!\n";

mais plutôt :

open(FIC_W,">>choix.txt") || die "Impossible de créer le fichier : $!\n";

J'ai testé, je confirme.


Il faut comprendre le principe http://jargonf.org/wiki/TMTOWTDI


Donc les 2 expressions sont équivalentes, ce n'est pas une erreur ni de syntaxe ni de logique.

En français

ouvre vers,en mode ajoute, fichier ou meurs - mon ex

ouvre vers le fichier mode ajoute ou meurs - ton ex

Cependant celle que j'ai écrit je la préfère pour 2 raison :

- open à 3 arguments pour eviter les ambiguités

- or pour sa précédence donc on n'a pas besoin de paranthèses.

Je suis au boulot, et je n'ai pas le temps pour repondre à tous tes messages.

Je t'écrirai ce soir avec plus des détails.
Quand je t'ai demandé de me dire les erreurs je ne parlais pas de code (qui fonctionne, figure toi que je l'ai testé et pas une seule fois).
Je parlais de résultat qu'on obtiens.

Le script tu l'éxecutes sans arguments et ça c'est grace à @ARGV

En fait l'opérateur <> lit d'abord dans @ARGV et s'il y a rien il lit depuis STDIN


Pour qr// regard ici http://bribes.org/perl/docfr/perlop.html#L7D40F9C5

Perl fournit des caractères standard pour cela mais fournit aussi le moyen de choisir vos propres caractères. Dans la table suivante, le {} représente n'importe quelle paire de délimiteurs que vous aurez choisie.

     Standard  Générique    Signification       Interpolation
        ''       q{}         Littérale            non
        ""      qq{}         Littérale            oui
        ``      qx{}          Commande            oui (sauf si délimiteur '')
                qw{}        Liste de mots         non
        //       m{}   Reconnaissance de motif    oui (sauf si délimiteur '')
                qr{}           Motif              oui (sauf si délimiteur '')
                 s{}{}       Substitution         oui (sauf si délimiteur '')
                tr{}{}     Translittération       non (voir plus bas)

En fait on utilise qr comme opérateur des regex.

Ca evite déjà de retaper la même regex plusieurs fois
Aussi quand tu veux corriger la regex tu ne le fait qu'une seule fois
Aussi pour la compilation de la regex.

A ce soir tu auras plus des détails. Maintenant tu peux modifier le code comme tu veux, dans Perl il n'y a pas des limites inutiles, cependant il faut faire attention puisqu'il y a plein des pièges.

lami20j
0
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
29 mars 2006 à 13:40
ok d'accord, je regarde ca de plus près.

PAr contre tu dis que le code marche ???

Je comprend pas pourquoi il marche pas chez moi. T'as bien pris le fichier1.txt que je t'ai envoyé ?

Miguel
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 567
29 mars 2006 à 13:44
Re,

envoi le script que tu utilises (peut êre il est mal copié) sur cjoint.com

Aussi décrit exactement ce que tu faire comme opérations étape par étape.
0