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

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

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

4 réponses

Avatar
Michel Rodriguez
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

Avatar
Stephane Zuckerman
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)

Avatar
Nicolas George
"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;

Avatar
Nanard