Discussion:
fonctions avec parametres divers
(trop ancien pour répondre)
luc2
2011-09-06 12:24:12 UTC
Permalink
salut,

en utilisant des libs, j'ai remarque que certaines de leurs fonctions
acceptaient des parametres a la suite :

fonction( 'hote.com', 80, 'tcp' );

...et que la meme fonction acceptait des parametres sous forme de hash :

fonction( host => 'hote.com', port => 80, protocol => 'tcp' );

comment ils font ca ?
Paul Gaborit
2011-09-06 15:16:40 UTC
Permalink
À (at) 06 Sep 2011 12:24:12 GMT,
Post by luc2
en utilisant des libs, j'ai remarque que certaines de leurs fonctions
fonction( 'hote.com', 80, 'tcp' );
fonction( host => 'hote.com', port => 80, protocol => 'tcp' );
comment ils font ca ?
En général, c'est plutôt un truc du genre :

fonction( 'hote.com', 80, 'tcp' );
ou
fonction({host => 'hote.com', port => 80, protocol => 'tcp'});

Les accolades supplémentaires permettent alors à la fonction appelée de
détecter que son seul paramètre est de type « référence à une table de
hachage » et donc d'identifier sans aucun risque un appel sous la
deuxième forme.

Pour faire comme vous le suggérez, cela me semble plus difficile et
lourd. Il faut d'abord vérifier qu'on a un nombre paire d'arguments
(sinon on est dans la première forme) puis ensuite vérifier que chaque
argument impaire correspond à une clé acceptable (sinon on est dans la
première forme) et alors on peut sans doute conclure qu'on est dans la
deuxième forme d'appel. Mais, je le répète, cela me semble très lourd et
risqué... De plus, je n'ai pas souvenir d'avoir déjà vu cela dans un
module Perl.

De quelles « libs » parlez-vous ?
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Stephane CHAZELAS
2011-09-06 18:15:57 UTC
Permalink
Post by Paul Gaborit
À (at) 06 Sep 2011 12:24:12 GMT,
Post by luc2
en utilisant des libs, j'ai remarque que certaines de leurs fonctions
fonction( 'hote.com', 80, 'tcp' );
fonction( host => 'hote.com', port => 80, protocol => 'tcp' );
comment ils font ca ?
[...]
Post by Paul Gaborit
De plus, je n'ai pas souvenir d'avoir déjà vu cela dans un
module Perl.
De quelles « libs » parlez-vous ?
CGI.pm? Voir le rearrange() de CGI::Util

(c'est plutot fonction(-host=>'host.com'...) et je suis d'accord
que c'est plutot dangereux et j'eviterais).
--
Stephane
Paul Gaborit
2011-09-06 23:54:43 UTC
Permalink
À (at) Tue, 6 Sep 2011 18:15:57 +0000 (UTC),
Post by Stephane CHAZELAS
Post by Paul Gaborit
À (at) 06 Sep 2011 12:24:12 GMT,
Post by luc2
en utilisant des libs, j'ai remarque que certaines de leurs fonctions
fonction( 'hote.com', 80, 'tcp' );
fonction( host => 'hote.com', port => 80, protocol => 'tcp' );
comment ils font ca ?
[...]
Post by Paul Gaborit
De plus, je n'ai pas souvenir d'avoir déjà vu cela dans un
module Perl.
De quelles « libs » parlez-vous ?
CGI.pm? Voir le rearrange() de CGI::Util
(c'est plutot fonction(-host=>'host.com'...) et je suis d'accord
que c'est plutot dangereux et j'eviterais).
C'est vrai. Je l'avais oublié celui-là... ;-)

Le module CGI est très ancien et utilise effectivement une version très
limitée de cette méthode (« limitée » dans le sens où la seconde forme
syntaxique ne s'applique que lorsque le premier argument commence par
"-" et, de plus, toutes les clés commencent par un "-").

En fait, je ne suis pas sûr que ce soit véritablement « dangeureux »
mais, en revanche, je trouve cela lourdingue (en tous cas, ça bouffe de
la CPU pour pas grand chose).

L'autre cas, qui me semble beaucoup plus courant, ce sont les modules
qui n'acceptent que la seconde forme (des paramètres nommés et donc non
positionnels).
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
luc2
2011-09-07 08:04:39 UTC
Permalink
Post by Paul Gaborit
De quelles « libs » parlez-vous ?
chais plus... j'ai tout oublie on dirait...

Loading...