11
votes

Que devrais-je mettre dans mon modèle de démarreur pour mes programmes PERL?

Je basse la majorité sur mes scripts Perl sur le modèle / squelette suivant:

#!/usr/bin/perl -w

use strict;
use utf8;

$| = 1;
binmode(STDOUT, ":utf8");

# my code goes here.
  • Activer les avertissements ( -w code>) li>
  • Activation du mode strict ( Utiliser strict code>) li>
  • aller pure utf-8 ( Utiliser utf8 code> + binmode (stdout, ": utf8") code>) li>
  • Désactiver la mise en mémoire tampon ( $ | = 1 code>) li> ol>

    Ma question est la suivante: p>

    Comment mon modèle peut-il être amélioré pour mieux refléter les meilleures pratiques de Perl? B> P> P> P>


  • 0 commentaires

    10 Réponses :


    18
    votes

    Remplacez le -w avec Utiliser des avertissements . Cela vous permet de désactiver des avertissements lexiquement si vous avez besoin. Voir perlexwarn .

    Le Utilisez UTF8 pragma est pour quand Votre code source est dans UTF-8. Si c'est bien. Sinon ... Je ne recommande pas d'ajouter des choses que vous n'utilisez pas réellement. De même, ne définissez pas stdout à UTF-8, sauf si vous ne le produisez réellement.

    La mémoire tampon de désactivation réduira les performances. Ne le faites pas à moins que vous n'ayez besoin, puis limitez la portée au bloc où il est nécessaire.

    J'aime inclure une déclaration pour indiquer explicitement la version minimale de PERL requise pour exécuter le script. Cela rend les messages d'erreur plus significatifs s'il ne compile pas en raison d'une personne utilisant une ancienne version de Perl. par exemple xxx

    J'utilise cette incantation particulière au lieu de quelque chose comme Utiliser v5.8.1 car il est compatible avec les versions de Perl que j'essaie "Support" avec un message d'erreur significatif.


    6 commentaires

    @Evancarroll: Utiliser 5.00801 est une erreur de syntaxe sous vraiment anciennes versions de Perl. (C'est-à-dire avant 5,004), le commence {Exiger 5.00801} Syntaxe est valide et meurt gracieusement. Certes, c'est une habitude que je suis entrée lorsque de telles versions étaient simplement anciennes et non positivement anciennes comme elles sont aujourd'hui.


    Il n'y a rien de mal avec utiliser . Ce n'est pas ancien, et il meurt de la même manière que vous le feriez, bien qu'il n'a pas le message "Begin a échoué - la compilation a abortie à ..."


    @brian D FOY: La syntaxe version a été ajoutée à 5.004. Sous les anciennes versions, il meurt avec Erreur de syntaxe à FOO.PL Line 1 tandis que les matrices de début nécessitent des matrices avec perl 5.xx requis - il s'agit uniquement de la version 5.yy . Je préfère le message qui ne me permet pas de faire état de "Votre script est cassé!" :RÉ


    S'ils utilisent quelque chose de moins de 5,004, ils ne méritent pas de soutien. Sérieusement.


    @briandfoy parce que vous, votre majesté, avez évidemment une puissance ultime pour déterminer qui est digne. Descend de tes grands chevaux.


    @ Hawken Perl 5.004 a été publié le 15 mai 1997. Sur 15 il y a des années. Il n'a pas été soutenu par la communauté Perl dans une décennie. Je serais émerveillé si vous pouviez trouver un fournisseur qui l'a expédié et est toujours disposé à le soutenir. Je voudrais réellement aller plus loin que Brian et dire que quiconque en utilisant un Perl avant 5,6 ne mérite pas de soutien. Toute personne utilisant un Perl prédiant 5.004 ne devrait pas s'attendre à une sorte de soutien et devrait interroger pourquoi ils utilisent des logiciels antiques, non pris en charge et problématiques.



    4
    votes

    Pas que c'est quelque chose qui puisse être obtenu dans un modèle en tant que tel, mais vous pouvez appliquer les meilleures pratiques de PERL en forçant les développeurs à exécuter perltidy et perlcrritique sur tous les indicateurs de sources . En outre Perl meilleures pratiques est une lecture musteuse, si vous me demandez.

    Quant à votre modèle, la seule chose que vous devriez envisager de changer est la parenthèse après la fonction BINMODE BINMODE BUSETIN , car elles ne sont pas requises (il s'agit de l'une des nombreuses recommandations du livre). < / p>


    0 commentaires

    8
    votes

    Que diriez-vous de lancer dans une documentation?

    =head1 NAME
    
    name here
    
    =head2 SYNOPSIS
    
    short synopsis here
    


    2 commentaires

    Oh! Quelqu'un pense que la documentation n'est pas cool. Serait intéressant de savoir pourquoi, cependant.


    Je ne sais pas pourquoi quiconque vous avez dit que vous avez dit, mais je préfère personnellement avoir mon script documenté dans une aide, non via POD.



    3
    votes

    Modifier la ligne d'interpréteur en xxx pré>

    Cela vous empêche d'utiliser -w, vous devrez donc aussi P>

    use warnings;
    


    3 commentaires

    Bon conseil / si / le script ne doit pas nécessiter une Perl installée. Perl peut être attendu dans / usr / bin / perl car contrairement à d'autres langues, c'est dans la FHS. Si vous ne vous souciez pas de courir le Perl que votre distribution expédiée avec une utilisation / USR / bin / env ou env ou env env Les Si vous le faites, vous pouvez taper statiquement l'emplacement Perl.


    Mais si vous voulez vous assurer que le comportement est le même si le script est invoqué directement ou via «Script Perl», vous devez utiliser / usr / bin / env. Utilisation / usr / bin / env Donne le script plus portable et donne à l'utilisateur plus de cohérence.


    Pour un cas particulier, considérons ce qui se passe si / usr / bin / perl si 5,8, $ Home / Bin / Perl si 5.10 et perl5OPT contient -MFeature = 5.10. Dans cet environnement, les scripts que le code dur / USR / bin / perl échouera, tandis que les scripts utilisateurs / USR / BIN / ENV fonctionnent.



    11
    votes

    Voici la mienne, même si je dois admettre que parfois, je commence juste à taper sans utiliser le gabarit. Je l'ai configuré comme un modulino, il est donc facile d'ajouter de l'essai à celui-ci ultérieurement:

    # -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
    # vim: ts=4 sts=4 sw=4:
    


    3 commentaires

    Merci pour votre réponse. Je ne me souviens pas de voir quoi que ce soit avant de mentionner la déclaration explicite du codage de la source comme une "meilleure pratique", mais cela a un sens totalement. Après avoir lu votre réponse, j'ai fini par lire Perlunitut, Perlunifaq, et "le minimum absolu Chaque développeur de logiciel absolument doit connaître de manière positive à propos de Unicode et des ensembles de caractères (aucune excuse!)" ( Joelonsoftware.com/articles/unicode.html ).


    Il y a une raison pour laquelle vous n'avez pas le chèque sur appelant () avant votre appel exécuter ? Les trucs que j'ai lus sur des modulinos suggèrent uniformément à l'aide de code comme celui-ci: __ package __-> exécuter (@argv) sauf si l'appelant (); pour créer le modulino utiliser . Je crois que vous avez même écrit certains de ces articles.


    @DaoToad: C'est ce que je reçois pour la modification du code pour le poste. J'ai réparé ça.



    2
    votes

    Une autre chose que vous voudrez peut-être regarder est la boîte à outils de module sur CPAN. Créé par Damian Conway Il vous permet d'assembler un ensemble de modules souvent utilisés, puis utilisez une seule "utilisation d'utilisation" au lieu de plusieurs. Donc au lieu de xxx

    vous auriez; xxx

    et tous les modules que vous avez placés dans votre boîte à outils seraient disponibles.


    1 commentaires

    Toolkit utilise des filtres source qui sont mieux évités. Toolset offre une fonctionnalité similaire sans risque de filtres source. Search.cpan.org/perldoc/toolset Voir Pourquoi les filtres source sont-ils mauvais? < / code> sur donc pour plus d'informations: Stackoverflow.com/Questtions/1785852/...



    1
    votes

    Je n'utilise jamais une ligne de shebang dans mon .pl scripts, ni j'utilise Utiliser lib / chemin / à / spécial / lib , afin de permettre à ces Soyez personnalisé pour chaque invocation: xxx

    et bien sûr, chaque fichier commence par: xxx

    Modifier : J'ai pensé à quelques choses de plus, que j'ai commencé à utiliser plus récemment: xxx


    0 commentaires

    1
    votes

    Bien que tout ce que je ne puisse pas, c'est pour le Web, il arrive souvent assez que je suis obligé d'ajouter:

    Utiliser cgi :: carpe QW (fataleStobrowser);

    à mon modèle de développement, que je présente une fois que cela frappe la production.


    0 commentaires

    2
    votes

    Je dirais que vous voulez inclure un ensemble standard de documentation de POD dans votre modèle, avec l'ensemble normal des titres que vous voyez la plupart des modules sur CPAN. J'aime inclure cela à la fin, mais vous pourriez l'aimer en haut ou même interspéré par le code. par exemple. À la fin:

    $ module-starter --module=My::Foo --author=markp --email=markp@example.com --mb
    $ tree My-Foo
    


    1 commentaires

    Merci pour la prise pour le module :: Démarreur. Vous pouvez également consulter les DISTER, FANCIER et plus complexes de RJBS :: Zilla.



    1
    votes

    Cela n'a pas de sens pour moi que vous voudriez, par défaut, désactiver la mémoire tampon.


    4 commentaires

    Mes scripts ne produisent généralement pas d'énormes quantités de données, de sorte que l'augmentation du nombre de syscalls générées par la mise sous-mémoire désactivée ne constitue pas un problème dans le cas général. Quand est-ce que vous désactivez la mémoire tampon de stdout une mauvaise idée?


    @knorv, fondamentalement à tout moment que vous écrivez un outil CLI faisant partie d'un pipeline non lu par l'homme, par exemple. Cat Big_Giant_File.dat | my_perl_script.pl> traitéed.dat


    Charles: Je suis au courant de cette affaire, mais en supposant que la quantité de données écrite sur stdout est petite - y a-t-il des inconvénients qui me manque?


    Ne jamais ajouter de code à votre programme qui n'est pas utile d'une manière ou d'une autre. "Cela ne fait pas mal" ne suffit pas à garder le code dans votre programme, même si ce n'est qu'une ligne.