@ bioinformatics :

Merci pour le script en perl, mais je l'ai testé, surement mal adapté mais en respectant tes consignes, et rien ne se passe.
j'explique : je tapes bien le nom du fichier source (sans puis avec l'extension .txt) avec le chemin complet, et après avoir rendu le script executable, et tapé la commande ./fichier.pl mais rien ne se passe, meme pas un retour de la ligne de commande, juste une page blanche.

Que faire ?????

merci d'avance pour l'aide.......
berok37 wrote:tapé la commande ./fichier.pl
J'ai un doute...

Ton fichier de l'as appelé comment ?
Si tu l'as appelé toto alors la commande et perl toto.pl ou ./toto.pl

Juste au cas où 🙂

++
@pingou :

on est bien d'accord, en commande j'ai tapé ./fichier.pl car mon fichier s'appelle fichier avec l'extension .pl

mais rien ne se passe, je vais essayer en le renommant et je vous tiens au courant...

@+++++
essai avec perl fichier.pl aussi
Le probleme vient sans doute du script perl en lui-meme. En effet, le premier fichier est effectivement ouvert en lecture seule:
open (FICHIER,"< nom_du_fichier.txt"); #nom du fichier à lire
En revanche, le deuxieme est lui aussi ouvert en lecture, et non en ecriture ! Donc rien n'est ecrit dedans, et je ne suis meme pas sur qu'il soit cree...
Il faut donc remplacer:
open (FIC ,"< nom_du_fic.txt"); # crée un nouveau fichier
par ca:
open(FIC,"> nom_du_fic.txt");
Comme ca, ca devrait mieux marcher

En perl, lorsque tu ouvres un fichier, si tu mets "<" devant, tu l'ouvres en lecture seule,
avec ">" tu l'ouvres en ecriture-ecrasement
avec ">>" tu l'ouvres en ecriture-ajout.

C'est d'ailleurs la meme chose en bash.
À berok37 : as-tu recopié le script tel quel ou t'es-tu hasardé à quelques modifications/adaptations ?

De mon humble avis, bioinformatics, emporté par sa passion pour Perl (mais qui n'a pas de langage de prédilection), a quelque peu oublié que berok37 découvre Bash... Chaque chose en son temps, on ne se lance pas dans Perl efficacemement si on a quelques lacunes en expressions rationnelles, etc 😉
JE m'excuse tut le monde après avoir jeté un oeil au pbm en effet y a une erreur et à la première ligne :-P :hammer:
#!/usr/bin/perl
open (FICHIER,"< nom_du_fichier.txt"); #nom du fichier à lire
@lignes = <FICHIER>; # met toutes les lignes dans le tableau
close FICHIER; ferme le fichier original comme ça sa fait un backup
open (FIC ,"< nom_du_fic.txt"); # crée un nouveau fichier
foreach $ligne(@lignes) { #pour chaques éléments du tableau
    if ($ligne =~ / /) { #si l'expresion régulière est match avec la ligne alors
    Print FIC "............\n";; #la ligne est modifié par quelquechose ce que tu veux
    }
    elsif ($ligne =~ / /) {  "une autre expression reguliere
     Print FIC "............\n"; #quelquechose
    }
   else { # et si aucune des expressions régulières
   print "la ligne:\n$ligne\nn\'a pas été modifié\n" ; # renvoi dans le terminal :[saut de ligne]la ligne:....[saut de ligne]n'a pas été modifié
   }
}close FIC
les expressions regulière:
[a-z] recherche tous caractères allant de a-z | [a-z]+ tous caractères allant de a-z répété 1 a plusieurs fois | [a-z]* tous caractères allant de a-z répété 0 a plusieurs fois
[0-9] tu imagine
[A-Z] idem
[a-zA-Z0-9] tous caractères alaphanumérique
le . tout sauf fin de ligne
\n saut de ligne
\s espace
\t tabulation
sa c'est la base

pour Fox Delta:
non le fichier je l'ouvre en lecture seule la première fois comme sa il ne le modifie pas par une mauvaise manip, ensuite un deuxième fichier et créer en recopiant les lignes tel quel et en modifiant juste celle qui sont vrai dans les if
Oui, je n'avais effectivement pas note l'erreur de la premiere ligne... Le genre de chose qui fait que ca ne marche pas, mais qui est toujours difficile a trouver, etant donne l'absence de message d'erreur.

berok37, je te conseillerais meme d'ecrire au debut du script:
#!/usr/bin/perl -w
use strict;
my(@lignes,$ligne);
De cette maniere, tu obtiendras des messages d'erreur a l'execution, et l'utilisation du package strict t'oblige a declarer les variables que tu utilises. De cette maniere, le script sera plus facile a debugger. Envoie simplement les messages d'erreur.

modif: J'avais bien compris que le premier etait ouvert en lecture seule pour le proteger. Cependant, je ne comprends pas comment tu reussis a ecrire dans le deuxieme s'il est aussi cree en lecture seule
@pingou :
j'ai essayé avec perl fichier.pl mais j'ai des erreurs successives, qui sont :

[root@portFB2 fberard]# perl fichier.pl
Bareword found where operator expected at fichier.pl line 1, near "/usr/bin"
(Missing operator before bin?)
Bareword found where operator expected at fichier.pl line 3, near "/root/Desktop"
(Missing operator before Desktop?)
syntax error at fichier.pl line 1, near "/usr/bin"
Unrecognized character \xC3 at fichier.pl line 5.


@ Fox Delta :

je vois si sa passe avec tes modifs et la commande ./fichier.pl
berok37 wrote:@pingou :
j'ai essayé avec perl fichier.pl mais j'ai des erreurs successives, qui sont :

[root@portFB2 fberard]# perl fichier.pl
Bareword found where operator expected at fichier.pl line 1, near "/usr/bin"
(Missing operator before bin?)
Bareword found where operator expected at fichier.pl line 3, near "/root/Desktop"
(Missing operator before Desktop?)
syntax error at fichier.pl line 1, near "/usr/bin"
Unrecognized character \xC3 at fichier.pl line 5.
Là on a les sorties des erreurs et on vois qu'en effet le #! manquais à la première ligne...

Il y en a visiblement une autre à la 3ème 😉 reste à voir si elle a déjà étais corrigé...

++
L'erreur de la troisieme ligne est sans doute due a l'oubli de #! elle aussi.

Tu pourrais nous envoyer le code tel qu'il est ecrit dans ton fichier.pl berok37 ? Se sera sans doute plus simple pour le debugger.

++
Reponses pour tous :
j'ai essayé avec perl fichier.pl et rien, ni avec ./fichier.pl

pour les erreurs, #! en a reglé une, et les < devant les chemins du fichier original en ont réglé une autre.

maintenant que je fasse perl fichier.pl ou ./fichier.pl, j'ai une nouvelle :
[root@portFB2 fberard]# perl fichier.pl
Unrecognized character \xC3 at fichier.pl line 5.

et avec le -w j'en ai une autre :
[root@portFB2 fberard]# perl fichier.pl
Unquoted string "ferme" may clash with future reserved word at fichier.pl line 4.
Unquoted string "comme" may clash with future reserved word at fichier.pl line 4.
Unrecognized character \xC3 at fichier.pl line 4.


et voici mon script :
#!/usr/bin/perl -w
open (FICHIER,"< /root/Desktop/essai_script/fstab.txt"); #nom du fichier à lire
@lignes = <FICHIER>; # met toutes les lignes dans le tableau
close FICHIER; ferme le fichier original comme ça sa fait un backup
open (FIC ,"< /root/Desktop/essai_script/fstab.txt"); # crée un nouveau fichier
foreach $ligne(@lignes) { #pour chaques éléments du tableau
if ($ligne =~ / /) { #si l'expresion régulière est match avec la ligne alors
Print FIC "............\n";; #la ligne est modifié par quelquechose ce que tu veux
}
elsif ($ligne =~ / /) { #une autre expression reguliere
Print FIC "............\n"; #quelquechose
}
else { # et si aucune des expressions régulières
print "la ligne:\n$ligne\n'a pas été modifié\n" ; # renvoi dans le terminal :[saut de ligne]la ligne:....[saut de ligne]n'a pas été modifié
}
}close FIC
il y a deux oublis dans ton script:
--> il y a un ";" en trop ligne 8
--> et il en manque un a la derniere ligne.

Par ailleurs, il faut remplacer les "=~ / /" par "=~ / ton expression reguliere /"
Dis nous quelles lignes tu veux recopier pour qu'on te fasse l'expression reguliere.
#!/usr/bin/perl -w
use strict;
open (FICHIER,"< /root/Desktop/essai_script/fstab.txt");  #nom du fichier à lire
@lignes = <FICHIER>;                                      # met toutes les lignes dans le tableau
close FICHIER;                                            #ferme le fichier original comme ça sa fait un backup
system(`cp /root/Desktop/essai_script/fstab.txt /root/Desktop/essai_script/fstab.bak`); #fichier sauvegardé
open (FIC ,"> /root/Desktop/essai_script/fstab.txt");     # crée un nouveau fichier
foreach $ligne(@lignes) {                                 #pour chaques éléments du tableau
    if ($ligne =~ / /) {                                  #si l'expresion régulière est match avec la ligne alors
    Print FIC "............\n";                           #la ligne est modifié par quelquechose ce que tu veux
    }
    elsif ($ligne =~ / /) {                               #une autre expression reguliere
     Print FIC "............\n";                          #quelquechose
    }
   else {                                                 # et si aucune des expressions régulières
   print "la ligne:\n$ligne\n\'a pas été modifié\n"; # renvoi dans le terminal :[saut de ligne]la ligne:....[saut de ligne]n'a pas été modifié
   }
close FIC;
Franchement écrire du code comme ça vite fait y a forcément des petites erreurs :-D
n'oublie pas de mettre ton expression régulière là je te les pas mises sa dépend de ta ligne a modifié.
C'est clair que c'est difficile de creer du code comme ca. Et je ne te blame pas du tout, bien au contraire, j'admire :-D, il n'y a vraiment pas beaucoup d'erreurs. Je me souviens de mon premier script perl, j'ai mis une semaine a le mettre au point !

Apres, ce qui est sympa, c'est de pouvoir se confronter a la communaute, pour corriger les legeres erreurs, ou alors confronter les differentes solutions envisagees. C'est pourquoi j'adore linux !
j'ai un peu améliorer le code mais bon je ne sais pas ce qu'il veut modifier quoi par quoi. si c'est un numéro de ligne on peut faire autrement.
Moi aussi je trouve sa cool l'entraide pour ça quand je peu. :-P 🙂
Vu l'heure, il doit etre parti se coucher. Ce n'est pas un vrai geek :-P :hammer:
Il va falloir attendre demain pour lui terminer son code.
bonjour a tous,
oui vous avez raison, je suis pas un geek (je sais meme pas ce que ca veut dire), et oui couché aussi, car aujourd'hui y avait quelques metres cubes de gravas a bouger a la pelle, alors.....
ceci étant dit, je continus : j'ai bien trouvé mes erreurs de ";" en huitieme ligne ,et en fin.
egalement, j'ai rajouté le "use strict;" de la 2nde ligne, mais rien a faire, ca passe toujours pas.
pour mes expressions régulières, je comprends bien que vous en ayez besoin pour m'aider, mais c'est la le souci, c'est que la tout de suite je suis en train d'essayer de monter un script assez utile (pour moi qui débute) quand je viens de faire une install toute fraiche, et que en lancant mon script, je donne simplement dans une boite dialog la partoche a monter, qui sera ensuite ecrite dans le fstab, puis montée, puis scrutée afin de pouvoir annoncer les differents repertoires, ou je n'aurai plus qu'a dire au script dans lequel se trouvent les diverses choses a installer, etc, etc,................
bon maintenant, pour raison de vouloir etre pratique, et securiser un peu le truc, (si jamais j'oublies une installer d'un rpm par exemple, ou si je me trompe de repertoire de montage pour une partoche en particulier), je voudrais que le script regarde chacune des lignes deja ecrites dans le fstab, puis si il en trouve une deja existante, que le script ressorte l'emplacement, et apres confirmation par l'utilisateur, qu'il ré-écrive la ligne du fstab si nécessaire, si je decide de changer de repertoire de montage ou autre modification......
Donc pour l'instant, je n'ai rien besoin de modifier, donc pas d'expression, mais si besoin, du fait que je travaille sur un fstab bidon (vous l'avez surement deja vu, vu le chemin du fichier a modifier), ce peut etre une partoche (sda1, sda5,etc... ou un repertoire du genre /media/donnees,etc,etc......).

Enfait, j'avance tres doucement en essayant de me poser d'abord les questions sur ce dont j'ai besoin, comment je peux le faire avec ce que je connais, et de quelle manière, en graphique ou en console, de manière stricte, ou modulable, voir révisable ou modifiable apres coup si besoin........

En attendant, meme avec les dernieres modifs dans le script, la console me renvoit encore une erreur :
[root@portFB2 fberard]# perl fichier.pl
Global symbol "@lignes" requires explicit package name at fichier.pl line 4.
Unrecognized character \xC3 at fichier.pl line 5.

pour finir je joint lae script qui renvoit cette erreur :
#!/usr/bin/perl -w
use strict;
open (FICHIER,"< /root/Desktop/essai_script/fstab"); #nom du fichier à lire
@lignes = <FICHIER>; # met toutes les lignes dans le tableau
close FICHIER; ferme le fichier original comme ça sa fait un backup
system(`cp /root/Desktop/essai_script/fstab /root/Desktop/essai_script/fstab.bak`);#fichier sauvegardé
open (FIC ,"> /root/Desktop/essai_script/fstab"); # crée un nouveau fichier
foreach $ligne(@lignes) { #pour chaques éléments du tableau
if ($ligne =~ / /) { #si l'expresion régulière est match avec la ligne alors
Print FIC "............\n"; #la ligne est modifié par quelquechose ce que tu veux
}
elsif ($ligne =~ / /) { #une autre expression reguliere
Print FIC "............\n"; #quelquechose
}
else { # et si aucune des expressions régulières
print "la ligne:\n$ligne\n\'a pas été modifié\n"; # renvoi dans le terminal :[saut de ligne]la ligne:....[saut de ligne]n'a pas été modifié
}
close FIC;

si tout ca peut vous aider, a mieux voir ce que je veux faire, et si vous avez des propositions..........

@+++++++++++++++++++++++++++++
#!/usr/bin/perl -w
use strict;
open (FICHIER,"< /root/Desktop/essai_script/fstab.txt");  #nom du fichier à lire
my @lignes = <FICHIER>;                                      # met toutes les lignes dans le tableau
close FICHIER;                                            #ferme le fichier original comme ça sa fait un backup
system(`cp /root/Desktop/essai_script/fstab.txt /root/Desktop/essai_script/fstab.bak`); #fichier sauvegardé
open (FIC ,"> /root/Desktop/essai_script/fstab.txt");     # crée un nouveau fichier
foreach my $ligne(@lignes) {                                 #pour chaques éléments du tableau
    if ($ligne =~ / /) {                                  #si l'expresion régulière est match avec la ligne alors
    Print FIC "............\n";                           #la ligne est modifié par quelquechose ce que tu veux
    }
    elsif ($ligne =~ / /) {                               #une autre expression reguliere
     Print FIC "............\n";                          #quelquechose
    }
   else {                                                 # et si aucune des expressions régulières
   print "la ligne:\n$ligne\n\'a pas été modifié\n"; # renvoi dans le terminal :[saut de ligne]la ligne:....[saut de ligne]n'a pas été modifié
   }
close FIC;
Tu n'avais pas pris la dernière mis a jour
Apres si tu veux avec TK on pourra mettre ce script en interface graphique 😉
ok pour la mise ajour, mais apres modif, j'ai toujours une erreur,
la voici :
[root@portFB2 fberard]# perl fichier.pl
Missing right curly or square bracket at fichier.pl line 18, at end of line
syntax error at fichier.pl line 18, at EOF
Execution of fichier.pl aborted due to compilation errors.