Perl - fonctions simples

Perl - fonctions simples - Perl - Programmation

Marsh Posté le 25-11-2009 à 11:33:06    

Salut
 
Je tente de debuter tout seul comme un grand avec perl, avec des petits scripts simples, mais je pedale un peu.
 
J'ai saisi (je crois [:ddr555]) le principe de l'array, j'essaie maintenant de m'attaquer aux fonctions
 
Je veux ecrire une fonction qui me donne le resultat de l'addition et du produit de 2 nombres que j'aurais prealablement entre.
 
Donc au debut j'ai ecrit ca :
 

Code :
  1. print "Enter a number :";
  2. $num1 = <>;
  3. print "Enter another number :";
  4. $num2 = <>;
  5. @pool = ("$num1","$num2" );


 
A partir de la faut donc que j'utilise mon "@pool" pour faire l'addition et la multiplication
 
Donc j'ai essaye un truc du genre avec l'addition au debut en m'aidant d'un site sur perl :
 

Code :
  1. sub add
  2. {   
  3.     $sum = 0;
  4.     foreach $item (@_)
  5.     {
  6.       $sum += $item;                       
  7.     }
  8.     return $sum;
  9. }
  10. $result = add(@pool);
  11. print "Sum of @pool is $result";


 
J'ai le resultat (sur 2 lignes d'ailleurs, pourquoi ? [:gratgrat]), mais maintenant je voudrais que la fonction me donne aussi le resultat du produit, et j'y arrive pas, je dois pas utiliser le bon operateur ou je sais pas quoi.
 
Quelqu'un peut aider rapidement un ptit newb plz ? [:theorie des lavabos]


---------------
Ma bibliotheque Mon Bar ⭐ מברכיך ברוך וארריך ארור
Reply

Marsh Posté le 25-11-2009 à 11:33:06   

Reply

Marsh Posté le 25-11-2009 à 16:35:52    

Citation :

J'ai le resultat (sur 2 lignes d'ailleurs, pourquoi ?)


Quand tu fais ça:

Code :
  1. print "Enter a number :";
  2. $num1 = <>;


$num1 va contenir ce que tu as tapé, c'est à dire une chaine de caractères terminée par un retour de ligne.
Donc @pool contient deux chaines terminées par \n et quand tu fais:

Code :
  1. print "Sum of @pool is $result";


quand @pool est évalué, son contenu est imprimé, soit les deux chaines de caractères avec les \n, d'ou les sauts de ligne obtenus.
Pourquoi ton addition marche quand même? parce que quand tu fais ça:

Code :
  1. $sum += $item;


le + force l'évaluation de $item (qui est donc une chaine de caractères terminée par \n) dans un contexte numérique, et donc c'est l'évaluation de $item comme nombre qui est ajouté à $sum.

 

Si tu fais:

Code :
  1. print "Enter a number :";
  2. $num1 = 0 + <>;


Ca va forcer l'évaluation numérique de l'input et le stocker comme valeur numérique dans $num1 (et tu verras la différence au print de @pool: tu auras juste les nombres sans saut de ligne)

 

Autre point:
Il vaudrait mieux écrire:
@pool = ($num1,$num2);
pool va contenir une copie des valeurs de $num1 et $num2 évaluées au moment de l'assignation.

 

Enfin, je ne sais pas si ce que tu essayes de faire ressemble à ceci, mais ça devrait te donner des idées:

Code :
  1. sub add_mul
  2. {    
  3.    $sum = 0;
  4.    $mul = 1;
  5.    foreach $item (@_)
  6.    {
  7.      $sum += $item;
  8.      $mul *= $item;
  9.    }
  10.    return ($sum, $mul);
  11. }
  12.  
  13. @result = add_mul(@pool);
  14. print "Sum of @pool is $result[0] and Mul is $result[1]";
 

Après, la procédure peut s'écrire de manière un peu plus condensée, mais c'est juste une question de style:

Code :
  1. sub add_mul {
  2.    my ($sum, $mul) = (0, 1);
  3.    foreach (@_) {
  4.        ($sum, $mul) = ($sum + $_, $mul * $_);
  5.    }
  6.    return ($sum, $mul);
  7. }
 


A+,


Message édité par gilou le 25-11-2009 à 16:57:07

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 25-11-2009 à 21:13:17    

Merci gilou :jap:
 
Entre temps, j'avais reussir a faire ca
 

Code :
  1. print "Enter a number :";
  2. $num1 = <>;
  3. print "Enter another number :";
  4. $num2 = <>;
  5. @pool = ("$num1","$num2" );
  6. sub addprod
  7. {
  8.    $addresult = $_[0] + $_[1];
  9.    print "The sum is : $addresult\n";
  10.    $prodresult = $_[0] * $_[1];
  11.    print "The product is: $prodresult\n";
  12. }
  13. addprod (@pool)


 


---------------
Ma bibliotheque Mon Bar ⭐ מברכיך ברוך וארריך ארור
Reply

Marsh Posté le 27-11-2009 à 06:38:26    

pour info : en perl, pas besoin de déclarer les subs avant.
 
Personnellement (et il me semble que la majorité des gens fait de meme) je les mets toutes les unes à la suite des autres à la fin.
 
Et en principe on déclare les variables avec my (ou our si besoin), comme ca par ex :
my $addresult = $_[0] + $_[1];
 
Mais dans ton cas, inutile de créer une variable, il suffit de faire ca, avec des parentheses pour rester dans le contexte numérique :
print "The sum is : ".($_[0]+$_[1])."\n";
 
Je pense qu'il est nécessaire pour ton apprentissage d'utiliser :
use strict;
au début de ton code. En gros ca va foirer lorsque qq chose n'est pas bien "propre".


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Marsh Posté le 27-11-2009 à 11:43:11    

MisterBark a écrit :

Je pense qu'il est nécessaire pour ton apprentissage d'utiliser :
use strict;
au début de ton code. En gros ca va foirer lorsque qq chose n'est pas bien "propre".


Ca va en particulier gueuler si on emploie des variables sans les avoir déclarées avec my (qui déclare une variable comme locale au bloc ou elle se trouve) ou comme globale (our, d'emploi rare, crée une globale au package), ou comme variable locale au bloc, qui override dans le bloc une variable de même nom déjà déclarée (local, surtout réservé a l'override local de $_, $/, etc)
Un template de base pour son code peut être comme suit

Code :
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. .............................
  7. __END__


ce qui est après le __END__ n'est pas interprété, ça permet d'y mettre du code pas encore valide, en cours d'édition, des notes perso... et la documentation au format pod
A+,


Message édité par gilou le 27-11-2009 à 11:44:03

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-12-2009 à 11:12:44    

merci pour les precisions et conseils :jap:


---------------
Ma bibliotheque Mon Bar ⭐ מברכיך ברוך וארריך ארור
Reply

Sujets relatifs:

Leave a Replay

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