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.
-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>
10 Réponses :
Remplacez le Le 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. P> 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 p> J'utilise cette incantation particulière au lieu de quelque chose comme -w code> avec
Utiliser des avertissements code>. Cela vous permet de désactiver des avertissements lexiquement si vous avez besoin. Voir perlexwarn .
Utilisez UTF8 code> 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. P>
Utiliser v5.8.1 code> car il est compatible avec les versions de Perl que j'essaie "Support" avec un message d'erreur significatif. p> p>
@Evancarroll: Utiliser 5.00801 CODE> est une erreur de syntaxe sous vraiment i> anciennes versions de Perl. (C'est-à-dire avant 5,004), le
commence {Exiger 5.00801} code> 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 code>. 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 code> a été ajoutée à 5.004. Sous les anciennes versions, il meurt avec Erreur de syntaxe à FOO.PL Line 1 i> 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 i> . 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 i> 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.
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 Quant à votre modèle, la seule chose que vous devriez envisager de changer est la parenthèse après la fonction BINMODE CODE> BINMODE BUSETIN CODE>, car elles ne sont pas requises (il s'agit de l'une des nombreuses recommandations du livre). < / p> perltidy code> et
perlcrritique code> sur tous les indicateurs de sources . En outre Perl meilleures pratiques est une lecture musteuse, si vous me demandez. P>
Que diriez-vous de lancer dans une documentation?
=head1 NAME name here =head2 SYNOPSIS short synopsis here
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 i> documenté dans une aide, non via POD.
Modifier la ligne d'interpréteur en Cela vous empêche d'utiliser -w, vous devrez donc aussi P>
use warnings;
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 code> 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.
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:
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!)" (
Il y a une raison pour laquelle vous n'avez pas le chèque sur appelant () code> avant votre appel
exécuter code>? 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 (); code> pour créer le modulino
utiliser code>. 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.
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 vous auriez; p> et tous les modules que vous avez placés dans votre boîte à outils seraient disponibles. p> p>
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/...
Je n'utilise jamais une ligne de shebang dans mon et bien sûr, chaque fichier em> commence par: p> .pl code> scripts, ni j'utilise
Utiliser lib / chemin / à / spécial / lib code>, afin de permettre à ces Soyez personnalisé pour chaque invocation:
Bien que tout ce que je ne puisse pas, c'est pour le Web, il arrive souvent assez que je suis obligé d'ajouter: p>
à mon modèle de développement, que je présente une fois que cela frappe la production. p> Utiliser cgi :: carpe QW (fataleStobrowser); code> p>
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
Merci pour la prise pour le module :: Démarreur. Vous pouvez également consulter les DISTER, FANCIER et plus complexes de RJBS :: Zilla.
Cela n'a pas de sens pour moi que vous voudriez, par défaut, désactiver la mémoire tampon. P>
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.