Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

File::Copy et filehandle

2 réponses
Avatar
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/>

2 réponses

Avatar
Paul Gaborit
À (at) Fri, 06 Mar 2009 16:12:41 +0100,
Thomas vO <vanouden+ écrivait (wrote):
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 - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Thomas vO
salut Paul,

À (at) Fri, 06 Mar 2009 16:33:36 +0100,
Paul Gaborit nous disait (told us):
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 - <http://perso.enstimac.fr/~vanouden/>