J'ai un fichier de 50 Mo, je souhaiterais le d=E9couper =E0 chaque fois
qu'il y a la balise <HTML> en un "fichier fille"
Voila se que j'ai fais et marche pas :
#!/usr/local/bin/perl -wn
BEGIN {
$file =3D "$0";
$/ =3D \<HTML>;
$n =3D 1;
}
unless( $n++ % \<HTML> ) { close F;
open F, "> $file.csv"
or die "Impossible de cr=E9er $file.csv: $!";
$file++;
}
print F;
L'erreur : $ perl -w cut-perl partie00
readline() on unopened filehandle HTML at cut-perl line 4.
Use of uninitialized value in <HANDLE> at cut-perl line 1.
readline() on unopened filehandle HTML at cut-perl line 7.
print() on unopened filehandle F at cut-perl line 12.
Use of uninitialized value in <HANDLE> at cut-perl line 12, <> chunk 1.
L'erreur : $ perl -w cut-perl partie00 readline() on unopened filehandle HTML at cut-perl line 4.
Je crois que le message est clair, même si tu n'as que des notions d'anglais: Perl constate que tu lis à partir d'un descripteur de fichier sans l'avoir ouvert avant.
Tu ne voulais pas écrire plutôt
$/ = '<HTML>';
Bon, sinon, il y a plein de choses qui me semblent bizarres dans ton script. Quelques notes en vrac:
* Tu sais que $0 contient le nom du programme en cours? J'ai l'impression que tu penses y trouver le premier argument de ton programme. D'ailleurs, plus loin, tu incrémentes cette valeur, ce qui n'a de sens ni dans le premier cas, ni dans le cas réel.
* % est l'opérateur modulo. Il n'a de sens qu'avec des opérandes numériques à ma connaissance; je ne vois pas ce que tu fais avec « % <HTML> »
* Je ne vois pas l'intérêt de ton bloc BEGIN. Le contenu de ce bloc est destiné à être exécuté pendant la compilation. Dans ton cas, il contient des instructions qui peuvent tout aussi bien être exécutées pendant l'exécution normale.
* « print F; » ne doit pas faire grand chose d'intéressant. Tu veux peut-être écrire « print F $ma_chaine » (ou « print <F> », puisqu'on en est à faire n'importe quoi).
Tu n'as pas envie de t'acheter un petit livre sur Perl?
-- Jérémy JUST
On 13 Jun 2005 09:42:39 -0700
ptilou@gmail.com wrote:
L'erreur : $ perl -w cut-perl partie00
readline() on unopened filehandle HTML at cut-perl line 4.
Je crois que le message est clair, même si tu n'as que des notions
d'anglais: Perl constate que tu lis à partir d'un descripteur de fichier
sans l'avoir ouvert avant.
Tu ne voulais pas écrire plutôt
$/ = '<HTML>';
Bon, sinon, il y a plein de choses qui me semblent bizarres dans ton
script. Quelques notes en vrac:
* Tu sais que $0 contient le nom du programme en cours? J'ai
l'impression que tu penses y trouver le premier argument de ton
programme. D'ailleurs, plus loin, tu incrémentes cette valeur, ce qui
n'a de sens ni dans le premier cas, ni dans le cas réel.
* % est l'opérateur modulo. Il n'a de sens qu'avec des opérandes
numériques à ma connaissance; je ne vois pas ce que tu fais avec
« % <HTML> »
* Je ne vois pas l'intérêt de ton bloc BEGIN. Le contenu de ce bloc est
destiné à être exécuté pendant la compilation. Dans ton cas, il contient
des instructions qui peuvent tout aussi bien être exécutées pendant
l'exécution normale.
* « print F; » ne doit pas faire grand chose d'intéressant. Tu veux
peut-être écrire « print F $ma_chaine » (ou « print <F> », puisqu'on en
est à faire n'importe quoi).
Tu n'as pas envie de t'acheter un petit livre sur Perl?
L'erreur : $ perl -w cut-perl partie00 readline() on unopened filehandle HTML at cut-perl line 4.
Je crois que le message est clair, même si tu n'as que des notions d'anglais: Perl constate que tu lis à partir d'un descripteur de fichier sans l'avoir ouvert avant.
Tu ne voulais pas écrire plutôt
$/ = '<HTML>';
Bon, sinon, il y a plein de choses qui me semblent bizarres dans ton script. Quelques notes en vrac:
* Tu sais que $0 contient le nom du programme en cours? J'ai l'impression que tu penses y trouver le premier argument de ton programme. D'ailleurs, plus loin, tu incrémentes cette valeur, ce qui n'a de sens ni dans le premier cas, ni dans le cas réel.
* % est l'opérateur modulo. Il n'a de sens qu'avec des opérandes numériques à ma connaissance; je ne vois pas ce que tu fais avec « % <HTML> »
* Je ne vois pas l'intérêt de ton bloc BEGIN. Le contenu de ce bloc est destiné à être exécuté pendant la compilation. Dans ton cas, il contient des instructions qui peuvent tout aussi bien être exécutées pendant l'exécution normale.
* « print F; » ne doit pas faire grand chose d'intéressant. Tu veux peut-être écrire « print F $ma_chaine » (ou « print <F> », puisqu'on en est à faire n'importe quoi).
Tu n'as pas envie de t'acheter un petit livre sur Perl?
Oui ! La question que je me pose est quel opérateur à la place de %
Ptilou
damien guerin
En tout cas c'est ilisible... Tu devrais plutot faire une truc du style : open (IN, "< file.html"); open (OUT, ">out.tmp"); cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print <OUT>, $line; } close OUT;
Bon un truc du style, quoi... En cas, c'est nettement plus visible !
En tout cas c'est ilisible...
Tu devrais plutot faire une truc du style :
open (IN, "< file.html");
open (OUT, ">out.tmp");
cpt=0;
while ($line = <IN>) {
if ($line =~ /<HTML/) {
$cpt++;
close OUT;
rename "out.tmp", $cpt.".hml";
open (OUT, ">out.tmp");
}
print <OUT>, $line;
}
close OUT;
Bon un truc du style, quoi... En cas, c'est nettement plus visible !
En tout cas c'est ilisible... Tu devrais plutot faire une truc du style : open (IN, "< file.html"); open (OUT, ">out.tmp"); cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print <OUT>, $line; } close OUT;
Bon un truc du style, quoi... En cas, c'est nettement plus visible !
ptilou
Bonjour,
damien guerin wrote:
En tout cas c'est ilisible... Tu devrais plutot faire une truc du style : open (IN, "< file.html"); open (OUT, ">out.tmp"); cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print <OUT>, $line; } close OUT;
Bon un truc du style, quoi... En cas, c'est nettement plus visible ! 9a donne :
$ ./cut-perl Grd.html ./cut-perl: line 1: syntax error near unexpected token `IN,' ./cut-perl: line 1: ` open (IN, "< file.html");'
Pourquoi ?
Ptilou
Bonjour,
damien guerin wrote:
En tout cas c'est ilisible...
Tu devrais plutot faire une truc du style :
open (IN, "< file.html");
open (OUT, ">out.tmp");
cpt=0;
while ($line = <IN>) {
if ($line =~ /<HTML/) {
$cpt++;
close OUT;
rename "out.tmp", $cpt.".hml";
open (OUT, ">out.tmp");
}
print <OUT>, $line;
}
close OUT;
Bon un truc du style, quoi... En cas, c'est nettement plus visible !
9a donne :
$ ./cut-perl Grd.html
./cut-perl: line 1: syntax error near unexpected token `IN,'
./cut-perl: line 1: ` open (IN, "< file.html");'
En tout cas c'est ilisible... Tu devrais plutot faire une truc du style : open (IN, "< file.html"); open (OUT, ">out.tmp"); cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print <OUT>, $line; } close OUT;
Bon un truc du style, quoi... En cas, c'est nettement plus visible ! 9a donne :
$ ./cut-perl Grd.html ./cut-perl: line 1: syntax error near unexpected token `IN,' ./cut-perl: line 1: ` open (IN, "< file.html");'
Pourquoi ?
Ptilou
damien guerin
J'ai pondu ça à la mano sans rien tester... Bon voilà maintenant, c'est tester :
open (IN, "< file.html"); open (OUT, ">out.tmp"); $cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print <OUT>, $line;
}
close OUT;
C'est quoi ton interpréteur perl "cut-perl"???
J'ai pondu ça à la mano sans rien tester...
Bon voilà maintenant, c'est tester :
open (IN, "< file.html");
open (OUT, ">out.tmp");
$cpt=0;
while ($line = <IN>) {
if ($line =~ /<HTML/) {
$cpt++;
close OUT;
rename "out.tmp", $cpt.".hml";
open (OUT, ">out.tmp");
}
print <OUT>, $line;