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

Problème d'affichage de fichier

7 réponses
Avatar
Jseb
Bonjour,

Je suis débutant en Perl, et j'ai quelques problèmes d'affichage avec
ce script. Le but du script est d'afficher son source:

#!/usr/bin/perl
#ceci est un commentaire
open (hfile, "< ./tuto") #commentaire en bout de ligne
or die ("pas pu ouvrir le fichier");

while ( <hfile> ) {
$a = <hfile>;
#print <hfile>; #cette forme d'affichage ne saute pas de
lignes
print $a; #cette forme d'affichage saute des lignes
}
close hfile;

Pourtant, j'ai tout bien fait comme ils disent dans l'oreilly (mis à
part que le "print $a", c'est une invention à moi, mais bon je n'ai
pas l'impression de faire un truc très original non plus).

Merci.

7 réponses

Avatar
Alex Marandon
On 2005-02-07, Jseb wrote:
Bonjour,

Je suis débutant en Perl, et j'ai quelques problèmes d'affichage avec
ce script. Le but du script est d'afficher son source:

#!/usr/bin/perl


Quand on développe, il faut toujours mettre l'option -w qui active les
avertissements.

#ceci est un commentaire
open (hfile, "< ./tuto") #commentaire en bout de ligne


Par convention, les handlers de fichiers s'écrivent en majuscules.

Voici donc un script qui fait ce que tu attends :

#!/usr/bin/perl -w

open HFILE, '< tuto';
print while <HFILE>;
close HFILE;

__END__

Avatar
Jseb
Merci pour la réponse. Je note pour les warnings.

#!/usr/bin/perl -w

open HFILE, '< tuto';
print while <HFILE>;
close HFILE;

__END__


A priori, ça revient à ma première forme (print <hfile>, la ligne est
commentée dans mon source).
Mais pourquoi une récupération de la ligne ($a = <hfile>) suivie de
l'affichage de cette récupération (print $a) ne fonctionne pas ?

Avatar
Nicolas George
Alex Marandon wrote in message :
Par convention, les handlers de fichiers s'écrivent en majuscules.


(handle, pas handler)

Pour du perl moderne, je conseillerais plutôt d'utiliser l'autovivification
des file-handles :

open my $foobar, "<", "foobar" or die "foober: $!n";

Avatar
Paul Gaborit
À (at) Mon, 07 Feb 2005 14:29:55 +0100,
Jseb écrivait (wrote):
Mais pourquoi une récupération de la ligne ($a = <hfile>) suivie de
l'affichage de cette récupération (print $a) ne fonctionne pas ?


Ça fonctionne très bien.

Ce qui pose problème, c'est le 'while(<HFILE>)' qui lit une ligne (elle est
stockée dans la variable par défaut $_) dont vous ne tenez pas compte.

open HFILE, "< lefichier.txt"
or die "Lecture de 'lefichier.txt' impossible: $!n";
while (<HFILE>) {
# ici, $_ contient une ligne lue depuis HFILE !!!
print $_;
}
close HFILE;

En écriture Perl plus récente (5.8.x), cela donne :

open my $hfile, "<", "lefichier.txt"
or die "Lecture de 'lefichier.txt' impossible: $!n";
while (<$hfile>) {
# ici, $_ contient une ligne lue depuis $hfile !!!
print $_;
}
close $hfile;


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Jérémy JUST
On 07 Feb 2005 11:54:25 GMT
Alex Marandon wrote:

Quand on développe, il faut toujours mettre l'option -w qui active les
avertissements.


Et « use strict » qui limite les bêtises.


Le but du script est d'afficher son source:
Voici donc un script qui fait ce que tu attends :


#!/usr/bin/perl -w

open HFILE, '< tuto';
print while <HFILE>;
close HFILE;

__END__



J'ai plus élégant (le nom du fichier n'apparaît pas en dur):

<<<<<
#!/usr/bin/perl -w

use strict ;

open 0 ;
print <0> ;








--
Jérémy JUST





Avatar
Paul Gaborit
À (at) Mon, 7 Feb 2005 23:27:13 +0100,
Jérémy JUST écrivait (wrote):
J'ai plus élégant (le nom du fichier n'apparaît pas en dur):

<<<<<
#!/usr/bin/perl -w

use strict ;

open 0 ;
print <0> ;









Dans le genre 'rigolo', on a aussi :

<<<<<<<<<<<<<<<
#!/usr/bin/perl -w
seek DATA, 0, 0;
print <DATA>;
__DATA__


















Attention: le __DATA__ final est indispensable...

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
















Avatar
Jérémy JUST
On Tue, 08 Feb 2005 00:12:00 +0100
Paul Gaborit wrote:

#!/usr/bin/perl -w
seek DATA, 0, 0;
print <DATA>;
__DATA__



Très beau! Ça fait l'économie d'un open()!

--
Jérémy JUST