Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2953 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Perl :: probleme d'array et de length [resolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Perl :: probleme d'array et de length [resolu]

n°811033
Profil sup​primé
Posté le 30-07-2004 à 12:28:19  answer
 

je debute en perl, et j'ai fait un petit exercice issu d'un site.
 
Le but et de faire un prompt tant que l'input "quit" n'est pas tapé.
Une fois quit tapé, on doit reafficher tout les messages dans l'order inverse, tout en affichant le nombre de character de la phrase.
 
j'ai pondu cette sous routine

sub checkDot {
 if ($line ne "quit\n" ) {
  push (@lines, $line);
  $line = <STDIN>;
  &checkDot;
 }
 else {
  @lines = reverse(@lines);
  foreach $linz (@lines) {
   print $linz." <= ".length($linz)." character";  
  }
 }
}
 
$line = <STDIN>;  
&checkDot;


 
esuite je fait
 

C:\Perl\bin>perl c:/work/p3rl/helloworld.pl
salut
les
gens
d'hfr
quit


 
donc la le programme se stop, et il doit me le mettre en sens inverse :)
 
mais voila ce qu'il me sort [:zytrasnif]

d'hfr
 <= 6 charactergens
 <= 5 characterles
 <= 4 charactersalut
 <= 6 character


 
en gros, il me sort tout les mot mais en décalé et avec le \n (ce qui n'est pas le probleme :)
 
help :cry:


Message édité par Profil supprimé le 30-07-2004 à 13:05:08
mood
Publicité
Posté le 30-07-2004 à 12:28:19  profilanswer
 

n°811038
lorill
Posté le 30-07-2004 à 12:32:19  profilanswer
 

push (@lines, chomp($line));

n°811044
uriel
blood pt.2
Posté le 30-07-2004 à 12:35:29  profilanswer
 

chacal_one333 a écrit :



push (@lines, $line);




 
utilise chomp
 
edit: [:benou_grilled]


Message édité par uriel le 30-07-2004 à 12:36:22

---------------
IVG en france
n°811048
Profil sup​primé
Posté le 30-07-2004 à 12:38:47  answer
 

hmmm, j'ai bien mis le chomp, mais il me sort 1 au lieu de la string :??:  
 

C:\Perl\bin>perl c:/work/p3rl/helloworld.pl
test
test
quit
1 <= 1 character
1 <= 1 character

[:noxauror]

n°811049
simogeo
j'ai jamais tué de chats, ...
Posté le 30-07-2004 à 12:39:24  profilanswer
 

utilises chomp() [:franck75]
 
 
 
edit : han zut .. grilled [:grilled] [:autobot]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°811054
uriel
blood pt.2
Posté le 30-07-2004 à 12:42:11  profilanswer
 

[:kikiv] oui c'est bon j'ai fais autre chose alors que la enetre d'edit etait ouverte, en plus apparement y a pas que ca comem erreur...


---------------
IVG en france
n°811055
Profil sup​primé
Posté le 30-07-2004 à 12:42:31  answer
 

[:kiki]

n°811056
simogeo
j'ai jamais tué de chats, ...
Posté le 30-07-2004 à 12:43:11  profilanswer
 

uriel a écrit :

[:kikiv] oui c'est bon j'ai fais autre chose alors que la enetre d'edit etait ouverte, en plus apparement y a pas que ca comem erreur...


 
je plaisantais uriel [:calin]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°811057
Profil sup​primé
Posté le 30-07-2004 à 12:43:18  answer
 

je connaissait pas chomp, j'aurai mis un length-1 :o
 
mais bon, l'erreur est pas de la :cry:

n°811059
Mr Mala
Posté le 30-07-2004 à 12:46:31  profilanswer
 

Faut pas faire  
  push (@lines, chmop($line));  .. il aime pô ..
faut faire

Code :
  1. if ($line ne "quit\n" ) {
  2.   chomp($line);
  3.   push (@lines, $line);
  4.   $line = <STDIN>;
  5.   &checkDot;
  6. }


 

mood
Publicité
Posté le 30-07-2004 à 12:46:31  profilanswer
 

n°811061
Profil sup​primé
Posté le 30-07-2004 à 12:50:01  answer
 

Citation :

C:\Perl\bin>perl c:/work/p3rl/helloworld.pl
salut
les
gens
d'hfr
quit
d'hfr <= 5 character
gens <= 4 character
les <= 3 character
salut  <= 6 character

superbe merci :jap:
 
language à rallonge ca [:ktulu]

n°811064
Mr Mala
Posté le 30-07-2004 à 12:51:42  profilanswer
 

Heuu ouais en plus, tu te rends compte que tu fais une espèce de récursivité inutile ? ...
A la rigueur, essaye avec un while ...
 

Code :
  1. sub checkDot {
  2. while($line ne "quit\n" ) {
  3.   chomp($line);
  4.   push (@lines, $line);
  5.   $line = <STDIN>;
  6. }
  7. @lines = reverse(@lines);
  8. foreach $linz (@lines) {
  9.   print $linz." <= ".length($linz)." character\n"; 
  10. }
  11. }
  12. $line = <STDIN>; 
  13. &checkDot;



Message édité par Mr Mala le 30-07-2004 à 12:52:39
n°811067
Profil sup​primé
Posté le 30-07-2004 à 12:54:07  answer
 

en effet, pas mal comme ca :)

n°811148
lorill
Posté le 30-07-2004 à 14:13:36  profilanswer
 

ah vi c'est vrai, j'ai plus l'habitude des chaines mutables...

n°811150
pospos
Posté le 30-07-2004 à 14:14:46  profilanswer
 

Code :
  1. $/ = "quit\n";
  2. print join("\n", reverse split("\n", <> ));

n°811174
pospos
Posté le 30-07-2004 à 14:27:52  profilanswer
 

ha merde j'avais pas vu le coup de la longueur de la chaine!

Code :
  1. $/ = "quit\n";
  2. print join("\n", map{"$_\t<= ". length($_) . " characters"} reverse split("\n", <> ));


 
et si tu ne veux pas que le "quit" compte dans tes lignes:

Code :
  1. $/ = "quit\n";
  2. print join("\n", map{"$_\t<= ". length($_) . " characters"} reverse split(/(?:quit)?\n/, <> ));

n°811186
Profil sup​primé
Posté le 30-07-2004 à 14:36:35  answer
 

quit n'est pas dans mes ligne
 
en tout cas ton code :sweat:
pas encore assez avancé :/

n°811193
uriel
blood pt.2
Posté le 30-07-2004 à 14:43:22  profilanswer
 

faut vraiment que je me remette a faire du perl :/


---------------
IVG en france
n°811214
pospos
Posté le 30-07-2004 à 14:55:32  profilanswer
 

en gros l'explication:
<> (ou <STDIN<, ici ca revient au meme) ne renvoi pas la meme chose suivant qu'il est executé dans un contexte scalaire ($a=<> ou if(<> ) ou scalar(<> ) ou...) ou dans un contexte de liste (print <> ou @a=<> ou ....).
Dans un contexte de liste il renvoi toutes les lignes, alros que dans un contexte scalair il ne renvoi que la ligne suivante.
 
la variable $/ est une variable speciale qui indique à Perl quel est el separateur de ligne. normalement il est egal à "\n". Ici on lui dit que le separateur de ligne est "quit\n".
 
donc au lieu de n'avoir que la permiere ligne (separateur="\n" ) si on fait $a=<>, la on aura toutes les lignes jusqu'au separateur qui est "quit\n".
 
on recupere ca et on le split (spli est en contexte scalair donc c'est bon), selon les "\n":
split("\n", <> );
 
on obtient donc en sortie un tableau de lignes que l'on peu renverser avec reverse ou modifier avec un map (pour ajouter la longueur de la ligne).
ensuite il suffit de recoller tout ca avec un join, en remettant les "\n"

n°811226
Profil sup​primé
Posté le 30-07-2004 à 15:06:13  answer
 

:sweat:

n°811230
Profil sup​primé
Posté le 30-07-2004 à 15:07:24  answer
 

ps : merci pour l'explication [:joce]
 
je reviendrait quand je serait un peu plus avancé, c'est que ma 2eme journée :'(


Message édité par Profil supprimé le 30-07-2004 à 15:07:52
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Perl :: probleme d'array et de length [resolu]

 

Sujets relatifs
[PHP] problème de warning...probleme transfert de données d'access vers excel
[PHP/SQL] - delete [résolu][MySQL] gros probleme de requêtes
Probleme de session sous Jsp[java][mysql] probleme de connection
[Java] Problème avec le type longCSS : probleme de lien visited
[Perl] Probleme de connection Perl=>Mysql 
Plus de sujets relatifs à : Perl :: probleme d'array et de length [resolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR