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

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

Marsh Posté le 30-07-2004 à 12:28:19    

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
Reply

Marsh Posté le 30-07-2004 à 12:28:19   

Reply

Marsh Posté le 30-07-2004 à 12:32:19    

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

Reply

Marsh Posté le 30-07-2004 à 12:35:29    

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
Reply

Marsh Posté le 30-07-2004 à 12:38:47    

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]

Reply

Marsh Posté le 30-07-2004 à 12:39:24    

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


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 30-07-2004 à 12:42:11    

[: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
Reply

Marsh Posté le 30-07-2004 à 12:42:31    

[:kiki]

Reply

Marsh Posté le 30-07-2004 à 12:43:11    

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
Reply

Marsh Posté le 30-07-2004 à 12:43:18    

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

Reply

Marsh Posté le 30-07-2004 à 12:46:31    

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. }


 

Reply

Marsh Posté le 30-07-2004 à 12:46:31   

Reply

Marsh Posté le 30-07-2004 à 12:50:01    

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]

Reply

Marsh Posté le 30-07-2004 à 12:51:42    

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
Reply

Marsh Posté le 30-07-2004 à 12:54:07    

en effet, pas mal comme ca :)

Reply

Marsh Posté le 30-07-2004 à 14:13:36    

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

Reply

Marsh Posté le 30-07-2004 à 14:14:46    

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

Reply

Marsh Posté le 30-07-2004 à 14:27:52    

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/, <> ));

Reply

Marsh Posté le 30-07-2004 à 14:36:35    

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

Reply

Marsh Posté le 30-07-2004 à 14:43:22    

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


---------------
IVG en france
Reply

Marsh Posté le 30-07-2004 à 14:55:32    

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"

Reply

Marsh Posté le 30-07-2004 à 15:06:13    

:sweat:

Reply

Marsh Posté le 30-07-2004 à 15:07:24    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed