Je vois des gens à l'aide de deux styles pour passer des paramètres nommés à Perl: Quels sont les avantages à utiliser FOO () Strong> Style au lieu de bar () strong> style? p> p>
3 Réponses :
Premièrement, une explication des deux méthodes:
sub bar { my ($hash_ref) = @_; foreach my $key ( keys %$hash_ref ) { print "$key => $hash_ref->{$key}\n"; } } # pass a ref to an anonymous hash bar( { A=>'a', B=>'b' } );
Cela fait longtemps que je le lis, mais je pensais que la recommandation d'utiliser un hashref avec plus de 3 arguments était au lieu d'une liste d'arguments standard sans nom, c'est-à-dire appelant foo ("A", "B ') code>, plutôt que de recommander Hashrefs sur Hashhes
@plusplus: Le titre de la section est: "Utilisez un hachage d'arguments nommés pour tout sous-programme ayant plus de trois arguments." Dans le corps de la pièce, il dit spécifiquement d'utiliser un hachage réfé par des paires de noms brut / de valeur convertie en hachage.
La deuxième méthode passe une référence à hachage, tandis que le premier passe juste une liste. P>
Il y a deux aspects ici: En théorie, une référence à hachage pourrait être meilleure en termes de performance, mais pour de courtes listes d'arguments, cela est négligeable. Pour un appel simple comme Mais si l'appelant a déjà les valeurs dans un hachage, le premier style nécessite une conversion de hachage à la liste, puis de retour à hachage, qui peut être lent. P>
Le deuxième aspect est la question qui est responsable de la conversion à un hachage. Le premier style laisse la fonction appelé la fonction, et si cela ne fait que C'est pourquoi je préfère légèrement le deuxième style (ou j'utilise Perl 6, qui prend en charge des arguments nommés de manière nativement). P> foo (a => 1, b => 2) code> Il n'y a pas de différence de performance, car
@_ code> est en réalité un alias aux valeurs d'origine. < / p>
mon% args = @_ code>, il produira des avertissements curieux si la liste des arguments n'est pas de longueur égale. P>
Ces "aspects de performance" sont des micro-optimisations inutiles qui ne produisent aucun avantage pratique. Un hash peut être utilisé aussi facilement qu'une liste: foo (% hachage) code> ou un hashref:
foo (% {$ hashref}) code>. Coller avec le style FOO laisse plus de puissance à l'utilisateur.
En fait, mon propre benchmarking a montré (sur plusieurs installations) qu'il est plus rapide de transmettre des listes que de références - bien qu'elle apparaisse plus rapidement à Retour i> Références.
Les avertissements constituent une meilleure raison que les allégations de performances douteuses, mais si vous générez une tranche d'arguments à l'heure d'exécution de toute façon, il ne vous protège pas beaucoup de choses.
Le Pour une utilisation typique, je préfère le premier formulaire. Le Le deuxième formulaire est généralement vu. mélangé avec des arguments positionnels. par exemple. Benchmark fait ceci: p> tandis que TK laisse le c'est généralement un choix stylistique. p> p> FOO (A => 1, B => 2) CODE> Le style est habituel d'émuler des arguments nommés. La barre
({A => 1, b => 2}) code> est généralement utilisée uniquement pour des arguments supplémentaires (et éventuellement facultatifs).
{} code> est une typage supplémentaire, un bruit supplémentaire à lire et de créer une éventuelle erreur si vous laissez ou les deux accolades. Toute différence de performance est négligeable. (Si ce n'est pas le cas, vous avez de plus gros problèmes.) D'autre part, enveloppez les arguments dans un constructeur de hachage anonyme peut vous aider à trouver des erreurs au moment de la compilation plutôt que sur le temps d'exécution. P>
{} code> Out: p>