Question

Je fais beaucoup de programmation en Perl et je me demandais si les gens avaient un modèle « default » script Perl qu'ils utilisent et prêts à partager.

Je commencé à copier l'un de mes anciens scripts qui a des fonctions Getopt. Je pense les gens ont fait quelque chose de semblable?

Était-ce utile?

La solution

Comme on dit avant d'avoir mes méthodes modèles dans un module: use PMG::PMGBase; et pour le script initial escafolding, en tant qu'utilisateur emacs, j'ai mon perl-insert-start et modèles perl-add-getOption, mais écrire des choses comme:

(defun perl-insert-start ()
  "Places #!..perl at the start of the script"
  (interactive)
  (goto-char (point-min))
  (insert "#!/usr/bin/env perl\n\n")
  (insert "=head1 [progam_name]\n\n")
  (insert " description:\n\n")
  (insert "=cut\n\n")
  (insert "use feature ':5.10';\n")
  (insert "use strict;\n")
  (insert "#use warnings;\n")
  (insert "#use Data::Dumper;\n")
)

est un fastidieux bits. Donc, à la fin me est plus facile d'avoir un script de modèle Perl (voir ci-dessous), et l'appeler avec l'exécution de commande en région: C-u M-| :~/scripts/perl-start-template.pl Emacs après avoir sélectionné un espace dans un tampon vide:

#!/usr/bin/env perl

=head1 [progam_name]

 description:

=cut

use feature ':5.10';
use strict;
use Getopt::Long;

my $prog = $0;
my $usage = <<EOQ;
Usage for $0:

  >$prog [-test -help -verbose]

EOQ

my $help;
my $test;
my $debug;
my $verbose =1;


my $ok = GetOptions(
                    'test'      => \$test,
                    'debug:i'   => \$debug,
                    'verbose:i' => \$verbose,
                    'help'      => \$help,
                   );

if ($help || !$ok ) {
    print $usage;
    exit;
}


print template();


sub template {
    ##
    ### Here start the template code
    ##
    return <<'EOT';
#!/usr/bin/env perl

=head1 [progam_name]

 description: This script prints a template for new perl scripts

=cut

use feature ':5.10';
use strict;
#use warnings;
#use Data::Dumper;
use Getopt::Long;
# use Template;
# use PMG::PMGBase;  
# use File::Temp qw/ tempfile tempdir /;
# use File::Slurp;
# use File::Copy;
# use File::Path;
# use File::Spec;
# use File::Basename qw(basename dirname);
# use List::Util qw(reduce max min);
# use List::MoreUtils qw(uniq indexes each_arrayref natatime);

# my $PMGbase = PMG::PMGBase->new();
my $prog = $0;
my $usage = <<EOQ;
Usage for $0:

  >$prog [-test -help -verbose]

EOQ

my $date = get_date();

my $help;
my $test;
my $debug;
my $verbose =1;

my $bsub;
my $log;
my $stdout;
my $stdin;
my $run;
my $dry_run;

my $ok = GetOptions(
                    'test'      => \$test,
                    'debug:i'   => \$debug,
                    'verbose:i' => \$verbose,
                    'help'      => \$help,
                    'log'       => \$log,
                    'bsub'      => \$bsub,
                    'stdout'    => \$stdout,
                    'stdin'     => \$stdin,

                    'run'       => \$run,
                    'dry_run'   => \$dry_run,

                   );

if ($help || !$ok ) {
    print $usage;
    exit;
}

sub get_date {

    my ($day, $mon, $year) = (localtime)[3..5] ;

    return my $date= sprintf "%04d-%02d-%02d", $year+1900, $mon+1, $day;
}

sub parse_csv_args {

    my $csv_str =shift;
    return [split ',', $csv_str];
}

EOT


}

Autres conseils

Dans mon fichier .vimrc je

au BufNewFile *.pl s-^-#!/usr/bin/perl\r\ruse strict;\ruse warnings;\r\r-

qui écrit

#!/usr/bin/perl

use strict;
use warnings;

à tout nouveau script Perl. J'ai aussi

au BufNewFile *.pm s-^-package XXX;\r\ruse strict;\ruse warnings;\r\r1;-

pour les modules, mais je tendance à utiliser Module::Starter pour ceux de toute façon.

Quand je besoin d'un modèle de base pour de nombreux scripts similaires, je tourne simplement les pièces similaires dans un module. Le script se réduit alors à quelque chose comme:

 use App::Foo;

 App::Foo->run( @ARGV );

Le App::Foo hériterait du module de modèle et override tout était différent:

 package App::Foo;
 use parent qw(App::Template);

 ...

Dans le module App::Template, vous mettre dans tout ce que vous avez besoin:

 package App::Template;

 sub run {
    my( $class, @args ) = @_;

    my $self = $class->new( ... );
    $self->init;
    $self->process_command_line( ... );

    ...
    }


 sub process_command_line { ... }

 ...

Il y a des cadres sur CPAN pour ce genre de chose, mais je pense qu'il est tout aussi facile de le faire vous-même et obtenir exactement ce dont vous avez besoin sans traiter avec les pièces que vous n'avez pas besoin.

mine est assez simple.

#!/usr/bin/perl
use Modern::Perl

En ce qui concerne les choses comme getopt, il n'y a pas assez parmi les points communs scripts que je vous écris pour qu'il vaille la peine d'avoir un modèle plus bavard.

J'ai deux. Un ancien qui est un peu plus d'un emballage à un perl one-liner et un second qui a plus de fonctions et des exemples que je trouve souvent utile:

#!/usr/bin/perl
# name_of_script ver 0.01 YYYYMMDD authors@email.address
use strict;
no strict "refs";


sub footer
{
    my $this_year=`date +%Y`; chop($this_year);
    print "Copyright 2003-$this_year You or Company\n";
    # This isn't how copyright works -  the dates cove the time when the code
    #  was created.
}

sub help
{
    print "Usage: $0\n";
    &footer;
exit(0);
}

if( ($ARGV[0] =~ /^-+h/i) || (!$ARGV[0]) )
{
    &help;
}
##### code


##### end of code
print "Done that\n";

exit(0);

J'utilise ci-dessus pour le test rapide, mais le plus souvent j'utiliser ce qui suit, (quand je ne suis pas le piratage d'un module complet.)

#!/usr/bin/perl
# name_of_script ver 0.01 YYYYMMDD authors@email.address
use strict;
{
no strict "refs"; # this helps bypass frustration when I'm doing it wrong.
}

=head1 NAME

name_of_script

=head1 VERSION

0.01

=cut

our $VERSION = 0.01;

=head1 ABSTRACT

A synopsis of the new script

=head1 DESCRIPTION

Provide an overview of functionality and purpose of
this script

=head1 OPTIONS

%opt stores the global variables
%ignore overrides %opt

=cut

my (%opt,%ignore);

=head2 ARGS

=over 8

=item B<-h> send for help (just spits out this POD by default, but we can chose something else if we like 

=back

=head3 other arguments and flags that are valid

For when GetOpt is too heavy

-d -v -i[!] (value) 

=cut

for(my $args=0;$args<=(@ARGV -1);$args++){
    if ($ARGV[$args]=~m/^-+h/i){ &help; }
    elsif ($ARGV[$args] eq '-d'){ $opt{D}++; }
    elsif ($ARGV[$args] eq '-v'){ $opt{verbose}++;  print "Verbose output not implemented yet - try debug\n";}
    elsif ($ARGV[$args]=~m/-+i!(.+)/){ delete($ignore{$1}); }
    elsif ($ARGV[$args]=~m/-+record(.+)/){ $opt{record_data}++; }
    elsif ($ARGV[$args]=~m/-+w(ipe_home_dirs)?/){ $opt{wipe_home_dirs}++; }
    elsif ($ARGV[$args]=~m/-+i(.+)/){ $ignore{$1}=1; }
    elsif ($ARGV[$args]=~m/-+path(.+)/){ $opt{BASE_PATH} = $1; }
    elsif ($ARGV[$args]=~m/-+path/){ $args++; $opt{BASE_PATH} = $ARGV[$args]; }
    elsif ($ARGV[$args]=~m/-+dir(.+)/){ $opt{BASE_PATH} = $1; }
    elsif ($ARGV[$args] eq '-no-xml'||$ARGV[$args] eq '-no_xml'){ delete $opt{xml}; }
    elsif ($ARGV[$args] eq '-no-mkdir'||$ARGV[$args] eq '-no_mkdir'){ delete $opt{mkdir}; }
    elsif ($ARGV[$args] !~m/^-/ && -d "$ARGV[$args]"){ push @{ $opt{paths} }, $ARGV[$args] }
    else{ print "what is this $ARGV[$args] you talk of?\n"; &help; }
}


=head1 METHODS

=head3 footer

Adds the Copyright line to any output that needs it

=cut

sub footer { print "perldoc $0 \nCopyright 2011 You or Company\n"; }

=head3 help

Just the help output

=cut

sub help {
    print `perldoc $0`;
    #print "Usage: $0\n";
    #&footer;
    exit(0);
}

##### code


##### end of code

=head1 BUGS AND LIMITATIONS

There are no known problems with this script.
Please report any bugs or feature requests

=head1 SEE ALSO

#L<My::Modules>

=head1 MAINTAINER

is the AUTHOR

=head1 AUTHOR

Some Person, C<<some.person at example.com>>

=head1 LICENSE AND COPYRIGHT

Copyright 2011 Alexx Roche, all rights reserved.

This program is free software; you can redistribute it and/or modify it
under the terms of either: Eclipse Public License, Version 1.0 ; 
 the GNU Lesser General Public License as published 
by the Free Software Foundation; or the Artistic License.

See http://www.opensource.org/licenses/ for more information.

=cut

print "Done that\n" if $opt{verbose}>=1;
exit(0);
__END__

__ END__ est généralement utilisé que si nous allons avoir POD après le code Si vous déplacez le « DONE que » au-dessus du POD, puis __END__ plus de sens pour moi.

Ne hésitez pas à pirater ces deux à peu près autant que vous le souhaitez. Je ne prétends pas à un bon style ou pratiques ici, (et je commence parfois avec le court et coller dans des blocs de la plus longue que je en ai besoin de se retrouver avec deux styles de code pour les trolols.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top