2010-09-24 15 views
5

Hago mucha programación en Perl y me preguntaba si las personas tenían una plantilla "predeterminada" de script Perl que usan y están dispuestas a compartir.¿Tiene un buen script de plantilla Perl?

Comencé a copiar uno de mis scripts más antiguos que tiene Getopt funciones. Estoy pensando que la gente habría hecho algo similar?

Respuesta

5

Como dice la gente antes de tener mis plantillas de métodos en un módulo: use PMG::PMGBase; y para el script inicial escafolding, como usuario de emacs, tengo mis plantillas perl-insert-start y perl-add-getoption, pero escribiendo cosas como :

(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") 
) 

es un poco tedioso. Así que al final es más fácil para mí tener un script de plantilla de Perl (véase más adelante), y lo llaman con carrera de comandos-en-región: C-u M-| :~/scripts/perl-start-template.pl de Emacs después de seleccionar un espacio en blanco de tampón:

#!/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 


} 
1

El mío es bastante simple.

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

Cuando se trata de cosas como getopt, no hay suficientes elementos comunes entre los guiones que escribo para que valga la pena tener una plantilla más prolija.

+1

Bleh, great suggestion , [pero 'Modern :: Perl' no es suficiente ...] (https://rt.cpan.org/Public/Bug/Display.html?id=43061) –

+0

Es posible que desee hacer ese' #!/usr/bin/perl' o incluso '#!/usr/bin/env perl'. –

+1

@Evan - eso es subjetivo – Quentin

6

Cuando necesito una plantilla básica para muchos scripts similares, simplemente convierto las partes similares en un módulo. La secuencia de comandos se reduce a algo como:

use App::Foo; 

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

la App::Foo heredaría desde el módulo de plantilla y modificar el que era diferente:

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

... 

En el módulo App::Template, se pone en todo lo que necesita:

package App::Template; 

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

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

    ... 
    } 


sub process_command_line { ... } 

... 

Hay algunos marcos en CPAN para este tipo de cosas, pero creo que es igual de fácil hacerlo usted mismo y obtener exactamente lo que usted n sin tener que lidiar con las partes que no necesita.

7

En mi archivo .vimrc que tienen

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

que escribe

#!/usr/bin/perl 

use strict; 
use warnings; 

a cualquier nuevo script en Perl. También tengo

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

para los módulos, pero que tienden a utilizar Module::Starter para aquellos de todos modos.

+0

Quizás una pregunta ignorante, pero ¿por qué '\ r' en lugar de' \ n'? – Telemachus

+5

@Telemachus Porque eso es lo que funciona? Vim puede ser una bestia extraña a veces. –

+0

Eso es lo que recibo por no probar. Otra cosa más acerca de Vim que nunca supe (noté, encontré) antes. Para otros visitantes, consulte http://stackoverflow.com/questions/71323/how-to-replace-a-character-for-a-newline-in-vim y http://stackoverflow.com/questions/71417/why -is-ra-newline-for-vim – Telemachus

0

Tengo dos. Un viejo uno que es poco más que una envoltura para un Perl de una sola línea y un segundo que tiene más funciones y ejemplos que a menudo se encuentran útil:

#!/usr/bin/perl 
# name_of_script ver 0.01 YYYYMMDD [email protected] 
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); 

uso el anteriormente para prueba rápida pero más a menudo utilizo lo siguiente, (cuando no estoy pirateando un módulo completo))

#!/usr/bin/perl 
# name_of_script ver 0.01 YYYYMMDD [email protected] 
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__ generalmente se utiliza solamente si vamos a tener POD después del código Si se mueve el "hecho eso" por encima de la POD continuación __END__ tiene más sentido para mí.

Siéntase libre de hackear estos dos tanto como desee. No pretendo ningún buen estilo o práctica aquí, (ya veces comienzo con el corto y pego en bloques del más largo ya que los necesito terminando con dos estilos de código para los trolols.)

Cuestiones relacionadas