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

while imbriqués et $_

5 réponses
Avatar
Rakotomandimby (R12y) Mihamina
Bonjour,

Je cherche de la documentation sur une façon de faire quelquechose comme
ceci (code pour le principe):

open(F, "<", "test.txt");
while (<F>)
{
print $_ ;
while (split(/ /, $_))
{
print $_ ;
}
}

Avec ça, je "boucle" sur la premiere ligne du fichier ouvert.
J'esperais boucler sur tous les mots de chaque ligne. Ceci parceque dans
les faits je dois encore faire un traitement sur chaque mot (genre
remplacer les traits d'union par des espaces et autres...).

Auriez-vous des indications sur les mots-clés que je dois utiliser pour
avoir plus de renseignements sur ce sujet? "perl nested while $_" ne m'a
pas donné de renseignement satisfaisants...

Merci.

5 réponses

Avatar
Paul Gaborit
À (at) Wed, 26 Nov 2008 08:05:13 +0300,
"Rakotomandimby (R12y) Mihamina" écrivait (wrote):
Bonjour,

Je cherche de la documentation sur une façon de faire quelquechose
comme ceci (code pour le principe):

open(F, "<", "test.txt");
while (<F>)
{
print $_ ;
while (split(/ /, $_))
{
print $_ ;
}
}

Avec ça, je "boucle" sur la premiere ligne du fichier ouvert.



Normal... L'appel à 'split' n'alimente pas la variable $_ ! Et, dès
qu'on est sur une ligne non-vide, le second 'while' se transforme en
une boucle infinie !

J'esperais boucler sur tous les mots de chaque ligne. Ceci parceque
dans les faits je dois encore faire un traitement sur chaque mot
(genre remplacer les traits d'union par des espaces et autres...).

Auriez-vous des indications sur les mots-clés que je dois utiliser
pour avoir plus de renseignements sur ce sujet? "perl nested while $_"
ne m'a pas donné de renseignement satisfaisants...



En l'occurrence, une solution ne passe pas deux 'while' imbriqués mais
plutôt par un 'foreach' dans un 'while'. Ce qui donne en code pour le
principe :

open(F, "<", "test.txt");
while (<F>) {
print $_ ;
foreach (split(/ /, $_)) {
print $_ ;
}
}

Mais les espaces inter-mots ne sont pas remis en place...

Il faut donc faire autrement :

open(F, "<", "test.txt");
while (<F>) {
my @mots = split / /, $_;
foreach (@mots) {
# exemple de traitement sur $_
$_ =~ s/-/ /g;
}
print join(' ', @mots);
}

Ensuite, selon la nature du traitement à appliquer, il n'est pas
certain que le découpage en mot soit absolument nécessaire...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
Avatar
Patrice Karatchentzeff
"Rakotomandimby (R12y) Mihamina" a écrit :

[...]

Je cherche de la documentation sur une façon de faire quelquechose
comme ceci (code pour le principe):

open(F, "<", "test.txt");
while (<F>)
{
print $_ ;
while (split(/ /, $_))
{
print $_ ;
}
}



Marchera pas a priori : il faut renvoyer le split dans tableau et le
parcourir :

@tab = split() ;
for my $incr (@tab) {
traitement
}

PK
--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       
Avatar
Rakotomandimby (R12y) Mihamina
Paul Gaborit wrote:
open(F, "<", "test.txt");
while (<F>)
{
print $_ ;
while (split(/ /, $_))
{
print $_ ;
}
}
Avec ça, je "boucle" sur la premiere ligne du fichier ouvert.


Normal... L'appel à 'split' n'alimente pas la variable $_ !



Comment reconnait-on que telle ou telle instruction alimentera $_ ou
pas? J'avais en tete que tout ce qui retournait quelquechose le faisait.
Avatar
Patrice Karatchentzeff
"Rakotomandimby (R12y) Mihamina" a écrit :

Comment reconnait-on que telle ou telle instruction alimentera $_ ou
pas? J'avais en tete que tout ce qui retournait quelquechose le
faisait.



perldoc -f split

D'une façon générale, c'est bien expliqué dans chaque fonction.

Il ne manque que des exemples dans la doc de Perl :)

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       
Avatar
Paul Gaborit
À (at) Wed, 26 Nov 2008 13:12:43 +0300,
"Rakotomandimby (R12y) Mihamina" écrivait (wrote):
Comment reconnait-on que telle ou telle instruction alimentera $_ ou
pas? J'avais en tete que tout ce qui retournait quelquechose le
faisait.



Il n'y a aucun moyen de savoir a priori si telle ou telle fonction
utilisera ou non $_. Pour le savoir, il faut lire la documentation.

Pour les fonctions intégrées telle que 'split' :

perldoc -f split
ou
perldoc perlfunc


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