12
votes

À Perl, est-il approprié d'utiliser une carte dans le contexte annuel au lieu d'une boucle de forach?

en Perl, si vous avez une boucle comme celle-ci:

map {
    perform_action($_)
} @items;


0 commentaires

3 Réponses :


3
votes

Je crois que "Perl Les meilleures pratiques" recommanderaient d'utiliser une variable explicite dans la boucle foreach code> comme meilleur style - c'est certainement ce que j'utiliserais.

foreach my $item (@items)
{
    perform_action($item);
}


1 commentaires

Je pourrais dire "mal comprendre" moreso que "abus", mais oui: pour mon article $ (@items) {acte ($ d'article)} est tellement mieux que de ne pas comparer.



17
votes

à partir de Perl 5.8.1 carte dans le contexte vide n'est pas cher:

carte dans le contexte vide n'est plus cher. carte est maintenant conscient du contexte, et ne construira pas une liste si appelé dans le contexte vide.

mais la forme postfix de pour peut être plus lisible: xxx


2 commentaires

Bien que la déclaration de la carte elle-même puisse être au courant de son contexte, le programmeur pourrait non plus. Des constructions telles que sous-foo {carte {...} @_} Il n'est pas facile de dire ce qui se produira et si vous fuyez des parties de votre implémentation pendant que tout ce que vous vouliez faire était pour abuser de la carte comme régulier.


Perverdoc dit également que la boucle de Forach est plus claire, puis carape: "Notez que $ _ est un alias à la valeur de la liste. Il peut donc être utilisé pour modifier les éléments de la liste. Bien que cela soit utile et supporté, il peut causer des résultats bizarres si Les éléments de la liste ne sont pas des variables. L'utilisation d'une boucle de foresach régulière à cette fin serait plus claire dans la plupart des cas. "



14
votes

Le problème avec l'utilisation de mappe ou grep dans le contexte vide est principalement conceptuel. Les deux sont des constructions dont le travail consiste à renvoyer une liste. Pour supprimer cette liste, il faut que le code embrouillé, peu clairs sur le concept de listOps. Je n'utilise jamais l'une ou l'autre de ceux dans le contexte vide moi-même.

Je ressens la même chose à propos de l'opérateur conditionnel ternaire. Son travail consiste à renvoyer une valeur, alors l'utiliser dans le contexte vide n'a aucun sens et confond des personnes.

Cela dit, je ne voudrais pas mettre trop beaucoup de stock dans perl :: critique ou même pbp. Je suppose qu'il est préférable que le livre existe que cela ne soit pas, mais les gens aussi souvent malentent tout cela et finissent par l'utiliser comme un matraque.


0 commentaires