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

  FORUM HardWare.fr
  Programmation
  Perl

  Perl - fonctions simples

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Perl - fonctions simples

n°1944353
Dworkin
⭐ Evil Camp Represent ⭐
Posté le 25-11-2009 à 11:33:06  profilanswer
 

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 ⭐ מברכיך ברוך וארריך ארור
mood
Publicité
Posté le 25-11-2009 à 11:33:06  profilanswer
 

n°1944650
gilou
Modérateur
Modzilla
Posté le 25-11-2009 à 16:35:52  profilanswer
 

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é!  --
n°1944751
Dworkin
⭐ Evil Camp Represent ⭐
Posté le 25-11-2009 à 21:13:17  profilanswer
 

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 ⭐ מברכיך ברוך וארריך ארור
n°1945176
MisterBark
be aware
Posté le 27-11-2009 à 06:38:26  profilanswer
 

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)
n°1945277
gilou
Modérateur
Modzilla
Posté le 27-11-2009 à 11:43:11  profilanswer
 

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é!  --
n°1946218
Dworkin
⭐ Evil Camp Represent ⭐
Posté le 01-12-2009 à 11:12:44  profilanswer
 

merci pour les precisions et conseils :jap:


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

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

  Perl - fonctions simples

 

Sujets relatifs
Suppression d'ancien fichier en PERL[PERL] aide script pour alimenter SGBD MySQL
Manipulation basique de fichier texte a l'aide de Perlles fonctions "thread_safe" et la programmation multi-thread
comment générer des tableaux en perlRecherche d'une solution pour gérer des données simples
Créer ses propres fonctions dans excel 2007 !Quelques problèmes simples en AS 3
[VBA-Outlook] Changer de compte en fonctions de critères[Résolu][Perl] Chaine entre 2 délimiteurs
Plus de sujets relatifs à : Perl - fonctions simples


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