Copier un fichier dans un autre repertoire avec Perl
Résolu/Fermé
A voir également:
- Copier un fichier dans un autre repertoire avec Perl
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Ouvrir un fichier .bin - Guide
- Comment ouvrir un fichier docx ? - Guide
2 réponses
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 5/09/2013 à 15:09
Modifié par [Dal] le 5/09/2013 à 15:09
Salut perl2013,
Il y a beaucoup d'erreurs et d'incohérences dans ton code.
En précédant ton code de :
ton code ne compile pas, avec plusieurs erreurs, dont tu devrais déterminer la cause pour les corriger.
je ne vois pas à quoi cela sert
on sait pas ce qu'est fichiers, ce n'est pas une variable en tout cas, et ta syntaxe de open n'est pas conforme à la documentation : https://perldoc.perl.org/functions/open en revanche, cette syntaxe fonctionnerait :
dans le while($files=<FILE>) tu dois probablement faire un :
sinon, tu prends aussi le retour à la ligne, ce qui peut expliquer que tes commandes cp ne fonctionnement pas, d'ailleurs, puisque la concaténation dans system("cp $files $lpath"); va inclure le retour à la ligne à la fin de $files et :
- le 2ème argument sera manquant pour cp,
- le 2ème argument va se retrouver tout seul dans une nouvelle ligne envoyée au shell, qui ne saura pas quoi en faire, car ce n'est pas une commande système.
tu déclares toutes tes variables, mais pas $lpath. En mode "strict" ton programme ne passe pas. Donc :
tu fais un while ($i<5) à l'intérieur de ta boucle principale. je ne vois pas à quoi elle sert. Elle ne fait que répéter la copie du premier fichier trouvé dans le fichier texte 4 fois sous 4 noms différents. Pour les fichiers suivants trouvés dans le fichier texte, aucune copie n'a lieu, car $i dépasse 4. Ce n'est pas ce que tu veux faire. Supprime ce while.
Si ce que tu veux, c'est arrêter le while de ta boucle principale si 4 lignes du fichier texte ont été traitées, tu utilises last (https://perldoc.perl.org/functions/last) dans ta boucle while
Enfin, pour copier des fichiers, en Perl, au lieu d'utiliser system et de lancer une commande par le shell, tu peux utiliser la fonction Perl copy après avoir inclus use File::Copy; dans tes directives.
https://perldoc.perl.org/File::Copy
Ton programme sera portable et en prime tu peux gérer les erreurs avec un message explicite.
Tu as les éléments pour finaliser ton code, mais je te conseille vraiment de revoir les bases et d'être plus rigoureux.
Dal
Il y a beaucoup d'erreurs et d'incohérences dans ton code.
En précédant ton code de :
use strict; use warnings;
ton code ne compile pas, avec plusieurs erreurs, dont tu devrais déterminer la cause pour les corriger.
system("cp test01 bliz");
je ne vois pas à quoi cela sert
open(FILE, fichiers);
on sait pas ce qu'est fichiers, ce n'est pas une variable en tout cas, et ta syntaxe de open n'est pas conforme à la documentation : https://perldoc.perl.org/functions/open en revanche, cette syntaxe fonctionnerait :
open(FILE, "</chemin/vers/ma/liste_de_fichiers.txt");
dans le while($files=<FILE>) tu dois probablement faire un :
chomp($files);
sinon, tu prends aussi le retour à la ligne, ce qui peut expliquer que tes commandes cp ne fonctionnement pas, d'ailleurs, puisque la concaténation dans system("cp $files $lpath"); va inclure le retour à la ligne à la fin de $files et :
- le 2ème argument sera manquant pour cp,
- le 2ème argument va se retrouver tout seul dans une nouvelle ligne envoyée au shell, qui ne saura pas quoi en faire, car ce n'est pas une commande système.
tu déclares toutes tes variables, mais pas $lpath. En mode "strict" ton programme ne passe pas. Donc :
my $lpath = "...
tu fais un while ($i<5) à l'intérieur de ta boucle principale. je ne vois pas à quoi elle sert. Elle ne fait que répéter la copie du premier fichier trouvé dans le fichier texte 4 fois sous 4 noms différents. Pour les fichiers suivants trouvés dans le fichier texte, aucune copie n'a lieu, car $i dépasse 4. Ce n'est pas ce que tu veux faire. Supprime ce while.
Si ce que tu veux, c'est arrêter le while de ta boucle principale si 4 lignes du fichier texte ont été traitées, tu utilises last (https://perldoc.perl.org/functions/last) dans ta boucle while
last if ($i == 4);
Enfin, pour copier des fichiers, en Perl, au lieu d'utiliser system et de lancer une commande par le shell, tu peux utiliser la fonction Perl copy après avoir inclus use File::Copy; dans tes directives.
https://perldoc.perl.org/File::Copy
Ton programme sera portable et en prime tu peux gérer les erreurs avec un message explicite.
copy($files, $lpath) or die "La copie a échoué : $!";
Tu as les éléments pour finaliser ton code, mais je te conseille vraiment de revoir les bases et d'être plus rigoureux.
Dal