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
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
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.
lepetitjoe@caramail.com wrote in message
<1156944277.453937.227990@i3g2000cwc.googlegroups.com>:
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.
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.
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. ========================= ===
lepetitjoe@caramail.com 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.
========================= ===
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. ========================= ===