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/>
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/>
À (at) Fri, 06 Mar 2009 16:12:41 +0100,
Thomas vO <vanouden+news@rf.esuoluot-vinu.invalid> é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 :
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 !
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/>
À (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/>
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/>
salut Paul,
À (at) Fri, 06 Mar 2009 16:33:36 +0100,
Paul Gaborit <Paul.Gaborit@invalid.invalid> 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/>
À (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/>