File::Copy et filehandle

Le
Thomas vO
bonjour,

je n'arrive pas à m'expliquer le comportement de File::Copy dans ce
cas :

#!/usr/bin/perl

use strict;
use warnings;
use File::Copy;

open my $fh, "+>", 'test.txt' or die "Error: $!";
print $fh "je mets une phrase";
copy($fh, "temp.txt");
close $fh;

__END__

lorsque j'exécute, je me retrouve avec :

thomasvo@pc-thomasvo[~/tests]% perl fclp.pl && cat test.txt && cat temp.txt
je mets une phrase

pourtant, la doc de File::Copy dit "Either argument may be a string, a
FileHandle reference or a FileHandle glob", je ne comprends donc pas
pourquoi je me retrouve avec un temp.txt vide

si quelqu'un peut m'expliquer, merci !

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #18838481
À (at) Fri, 06 Mar 2009 16:12:41 +0100,
Thomas vO
je n'arrive pas à m'expliquer le comportement de File::Copy dans ce
cas :

#!/usr/bin/perl

use strict;
use warnings;
use File::Copy;

open my $fh, "+>", 'test.txt' or die "Error: $!";
print $fh "je mets une phrase";
copy($fh, "temp.txt");
close $fh;

__END__

lorsque j'exécute, je me retrouve avec :

[~/tests]% perl fclp.pl && cat test.txt && cat temp.txt
je mets une phrase

pourtant, la doc de File::Copy dit "Either argument may be a string, a
FileHandle reference or a FileHandle glob", je ne comprends donc pas
pourquoi je me retrouve avec un temp.txt vide...

si quelqu'un peut m'expliquer, merci !



A première vue, on pourrait penser à un problème de bufferisation. En
ajoutant un "n" à la fin de la chaîne, elle sera écrite immédiatement
dans le fichier (on peut aussi passer par un appel explicite à la
méthode 'flush' de IO::Handle).

Mais en fait, c'est un peu plus compliqué. Si on passe un filehandle à
File::Copy, il ne copie qu'à partir de l'endroit où en est rendu le
filehandle dans le fichier ('seek' permet de se positionner
précisément dans un fichier).

Le petit exemple suivant devrait t'éclairer (un peu) :

#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;
use Fcntl;
open my $fh, "+>", 'test.txt' or die "Error: $!n";
print $fh "je mets une phrase";
close $fh;
open $fh, "<", 'test.txt' or die "Error: $!n";
seek($fh, 5, Fcntl::SEEK_SET);
copy($fh, "temp.txt");
close $fh;
__END__

--
Paul Gaborit - Perl en français -
Thomas vO
Le #18838671
salut Paul,

À (at) Fri, 06 Mar 2009 16:33:36 +0100,
Paul Gaborit
Mais en fait, c'est un peu plus compliqué. Si on passe un filehandle
à File::Copy, il ne copie qu'à partir de l'endroit où en est rendu
le filehandle dans le fichier ('seek' permet de se positionner
précisément dans un fichier).



j'ai pas encore tout bien compris, mais je vais regarder...

Le petit exemple suivant devrait t'éclairer (un peu) :



en effet, je vois comment m'en tirer, maintenant.

merci !

--
Thomas vO -
Publicité
Poster une réponse
Anonyme