Comment passer un descripteur de fichier en parametre a une fonction ?

Le
Nanard
Bonjour

Ma question du jour :
J'ai un fichier ouvert avec :
open (MON_FICHIER , ">>toto.txt");

je voudrais passer 'MON_FICHIER' en parametre a ma fonction
'traitement_fichier' :
traitement_fichier (MON_FICHIER);


Dans cette fonction, bien sur, je voudrais y faire des :
????MON_FICHIER_PARAM = @_[0];
print MON_FICHIER_PARAM "coucou";


Mais je sais pas trop comment faire pour que mon exemple marche.
Une idee ?

Merci

Nanard
Vos réponses
Trier par : date / pertinence
Michel Rodriguez
Le #23724
Nanard wrote:
Bonjour

Ma question du jour :
J'ai un fichier ouvert avec :
open (MON_FICHIER , ">>toto.txt");

je voudrais passer 'MON_FICHIER' en parametre a ma fonction
'traitement_fichier' :
traitement_fichier (MON_FICHIER);


Dans cette fonction, bien sur, je voudrais y faire des :
????MON_FICHIER_PARAM = @_[0];
print MON_FICHIER_PARAM "coucou";


Mais je sais pas trop comment faire pour que mon exemple marche....
Une idee ?


Avec un perl recent le mieux c'est d'utiliser une variable normale au
lieu du traditionel DESCRIPTEUR_DE_FICHIER

use Fatal qw(open); # "die" si open ne maarche pas
open( my $df, '>>', 'toto.txt'); # open a 3 args, perl 5.8.*
traitement_fichier( $df);

sub traitement_fichier(
{ my( $df)= @_;
print {$df} "coucou"; # print $df "coucou" marche aussi mais
# je trouve que {$df} se voit mieux

}


Sinon, "a-la-papa":

traitement_fichier( *MON_FICHIER); # passe la reference du GLOB

sub traitement_fichier(
{ my( $df)= @_;
print {$df} "coucou"; # print $df "coucou" marche aussi mais
# je trouve que {$df} se voit mieux

}


--
mirod

Stephane Zuckerman
Le #23723
Ma question du jour :
J'ai un fichier ouvert avec :
open (MON_FICHIER , ">>toto.txt");


pour faire simple :

open(my $mon_fichier, ">>", "toto.txt") or die "$!";

De cette manière, vous pourrez passer le handle de fichier vers n'importe
quelle fonction facilement. Exemple :

### DEBUT
use strict;
use warnings;

open my $fh, "<", "toto.txt" or die $!;
print_all($fh);
close $fh or warn $!;

sub print_all {
my $fh = shift;
print while <$fh>;
}

### FIN

je voudrais passer 'MON_FICHIER' en parametre a ma fonction
'traitement_fichier' :
traitement_fichier (MON_FICHIER);


Si je ne me trompe pas, il faut passer *MON_FICHIER ...

open MON_FICHIER, "<", "toto.txt" or die $!;
print_all(*MON_FICHIER);
close MON_FICHIER or warn $!;

La sub ne change pas.

Dans cette fonction, bien sur, je voudrais y faire des :
????MON_FICHIER_PARAM = @_[0];
print MON_FICHIER_PARAM "coucou";


cf ma sub plus haut.

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Nicolas George
Le #23722
"Nanard" wrote in message
open (MON_FICHIER , ">>toto.txt");


Utilise l'autovivification des références sur filehandles (à mes souhants :).
Et par la même occasion, la forme à trois arguments d'open, et la
vérification des appels système :

open my $mon_fichier, ">>", "fichier.txt" or die "fichier.txt: $!n";

Ensuite, $mon_fichier est une variable scalaire comme une autre :

traitement_fichier (MON_FICHIER);


traitement_fichier $mon_fichier;

????MON_FICHIER_PARAM = @_[0];


my ($mon_fichier_param) = @_;

Et elle s'utilise aussi comme n'importe quel filehandle (sans virgule) :

print MON_FICHIER_PARAM "coucou";


print $mon_fichier_param $coucou;

S'il est nécessaire de faire entrer les filehandles prédéfinis dans ce
monde :

my $stdin = *STDIN;

Publicité
Poster une réponse
Anonyme