OVH Cloud OVH Cloud

le handle de fichier est il parametrable?

2 réponses
Avatar
lepetitjoe
Salut

je voudrais parametrer l=B4ouverture pour lecture de certains fichiers,
et cela de cette maniere:

#################

open (FIC, "<repertoire/docufinal.html" ) || die "error: cannot read
file";


foreach my $value(@file){
$cpt=3D$cpt+1;
open (FILE$cpt, "<repertoire/docu$cptinitial.html" ) || die "error:
cannot read file"; // 1407

@file$cpt=3D<FILE$cpt>; // Line 1409

print FIC @file$cpt;

}

close(FIC);

$cpt=3D0;
foreach my $value(@file){
$cpt=3D$cpt+1;
close(FILE$cpt);
}

##################

le nombre de fichiers (docu1initial.html ,docu2initial.html ...)
variant, j peux fixer le nombre ds le programme, foit tout d=B4=E1bord
savoir combien sont present ds le repertoire courant et les mettre ds
un tableau (@file), ensuite parcourir le tableau pr traiter 1 a 1
($value(@file))

Mais j=B4ai ces messages d=B4erreur a l=B4execution:

1-Scalar found where operator expected at ./prog.pl line 1409 near
@file$cpt

(Missing operator before $cpt?)

2-Missing comma after the first argument to open function at ./prog.pl
line 1407, near " "<repertoire/docu$cptinitial.html" ) "

je ne vois pas les pieges , quelqu=B4un pourrai aider? =20
=20
a bientot

2 réponses

Avatar
Nicolas George
wrote in message
:
open (FIC, "<repertoire/docufinal.html" ) || die "error: cannot read
file";


open my $fic, "<", "fichier" or die "fichier: $!n";

Par rapport à ta version :

- la forme à trois arguments d'open ;

- l'affichage de $! en cas d'erreur ;

- l'utilisation d'une variable lexicale comme filehandle.

C'est ce dernier point qui répond à ta question : cette variable lexicale
peut alors être utilisée exactement comme un filehandle, mais elle peut en
plus être manipulée comme n'importe quel scalaire, en particulier stockée
dans un tableau ou une table associative.

Avatar
Klaus
wrote:
je voudrais parametrer l´ouverture pour lecture de certains fichiers,
et cela de cette maniere:

open (FIC, "<repertoire/docufinal.html" ) || die "error: cannot read
file";


open $fic, '<', 'repertoire/docufinal.html' or die "error: cannot read
file ($!)";

[snip]

print FIC @file$cpt;


erreur de logique: on ne peut pas écrire dans un fichier qui a été
ouvert pour lecture.

[snip]

le nombre de fichiers (docu1initial.html ,docu2initial.html ...)
variant, j peux fixer le nombre ds le programme, foit tout d´ábord
savoir combien sont present ds le repertoire courant et les mettre ds
un tableau (@file), ensuite parcourir le tableau pr traiter 1 a 1
($value(@file))


Voici une réflexion:
Je ne vois pas le besoin de mettre les fichiers dans un tableau,
l'algorithme normale est d'extraire les noms de fichiers, un par un,
comme par exemple avec "readdir()", et on ouvre chaque fichier avec une
seule variable de fichier, la même variable de fichier sera
ré-utilisé pour le fichier suivant, etc...

Mais c'est juste une réflexion.

Par contre, en ce qui concerne la solution, je propose un module
"File::Find". -- Tout ce travail (savoir combien de fichiers sont
présent dans le répértoire courant, parcourir et traiter 1 par 1,
etc...) a déjà été fait dans le module "File::Find", voir
http://search.cpan.org/~nwclark/perl-5.8.8/lib/File/Find.pm

Voici un exemple: lecture de tous les fichiers *.pod dans le
répértoire "c:>perl" et écriture dans un fichier 'out.txt' de
chaque ligne contenant le mot /author/i avec le nom du fichier et le
numéro de ligne.

========================= ==========
use strict;
use warnings;
use File::Find;

open my $fic, '>', 'out.txt' or die "Erreur >out.txt ($!)n";
find(&wanted, 'c:/perl/'); sub wanted {
return unless /.pod/i;
open my $pod, '<', $_ or die "Erreur <$_ ($!)n";
my $nom_fic = $_;
my $no_lig;
while (<$pod>) { $no_lig++;
printf {$fic} "%-20s, ligne %4d: %sn",
$nom_fic, $no_lig, $1
if /(author)/i;
}
}

print {$fic} "n--- fin du fichier ---n";
========================= ==========

Une remarque sur mon exemple:

je n'utilise pas de "close". -- c'est parce que les fichiers avec les
variables lexicales sont fermée automatiquement dès qu'ils sont hors
de portée, voir aussi
http://perl.enstimac.fr/DocFr/perlfunc.html#item_open
========================= ===
:: En utilisant le constructeur du paquetage IO::Handle
:: (ou de l'une de ses sous-classes telles que IO::File
:: ou IO::Socket), vous pouvez générer des descripteurs
:: anonymes qui ont la même portée que les variables qui
:: gardent une référence sur eux et qui se ferment
:: automatiquement dès qu'ils sont hors de portée.
========================= ===