你有一个很好的Perl模板脚本吗?

Gor*_*don 5 perl templates getopt

我在Perl中做了很多编程,并且想知道人们是否有他们使用并愿意分享的"默认"模板Perl脚本.

我开始复制一个有Getopt功能的旧脚本.我在想人们会做类似的事吗?

Cha*_*ens 7

在我的.vimrc文件中我有

au BufNewFile *.pl s-^-#!/usr/bin/perl\r\ruse strict;\ruse warnings;\r\r-
Run Code Online (Sandbox Code Playgroud)

写道

#!/usr/bin/perl

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

任何新的Perl脚本.我也有

au BufNewFile *.pm s-^-package XXX;\r\ruse strict;\ruse warnings;\r\r1;-
Run Code Online (Sandbox Code Playgroud)

对于模块,但我倾向于使用Module::Starter那些.

  • @Telemachus因为那是有效的吗?Vim有时可能是一个奇怪的野兽. (5认同)

bri*_*foy 6

当我需要许多类似脚本的基本模板时,我只需将类似的部分转换为模块.然后脚本缩小为:

 use App::Foo;

 App::Foo->run( @ARGV );
Run Code Online (Sandbox Code Playgroud)

App::Foo会由模板模块,并覆盖一切是不同的继承:

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

 ...
Run Code Online (Sandbox Code Playgroud)

App::Template模块中,您可以随意添加:

 package App::Template;

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

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

    ...
    }


 sub process_command_line { ... }

 ...
Run Code Online (Sandbox Code Playgroud)

对于这类事情,CPAN上有一些框架,但我认为这样做很容易,并且在不处理您不需要的部分的情况下获得您需要的内容.


Pab*_*cia 5

正如人们之前说的那样,我在模块中使用了方法模板:use PMG::PMGBase;对于初始脚本escafolding,作为emacs用户,我有perl-insert-start和perl-add-getoption模板,但是编写如下内容:

(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")
)
Run Code Online (Sandbox Code Playgroud)

有点无聊.所以最后我更容易拥有一个Perl模板脚本(见下文),并C-u M-| :~/scripts/perl-start-template.pl在一个空白缓冲区中选择一个空格后从Emacs中调用run-command-on-region :

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


}
Run Code Online (Sandbox Code Playgroud)