Desenvolvimento Rápido de Programas Linha de Comando
-
Upload
garux -
Category
Technology
-
view
1.187 -
download
2
description
Transcript of Desenvolvimento Rápido de Programas Linha de Comando
Ferramentas Linha de ComandoFerramentas Linha de Comando
● Exibição de ajuda (“help”)● Parsing de argumentos
Tradicionais
● Dispatcher● Help específico● Shell
Orientada a comandos
linguagemX
ferramenta
Dicotomia do PerlDicotomia do Perl
Perl como ferramenta?Perl como ferramenta?
“Easy things, easy.”
Com Perl, quase tudo é fácil ;-)
Sysadmins e pesquisadores sabem disso(ou deveriam saber)
...e usam Perl diariamente como ferramenta parasolucionar problemas de forma rápida e eficiente(ou deveriam usar)
Problemas com Problemas com One-linersOne-liners(e pequenos programas)(e pequenos programas)
“escreva e descarte” (ou tenha pesadelos para manter)
Repetição constante
Baixa escalabilidade e flexibilidade
*cof*cof* documentação? *cof*cof*
Modelo TradicionalModelo Tradicional
Getopt::Long + Pod::Usage
Eficiente para programas lineares, mas não escala bem.
FrameworksFrameworks
DRY (Don't Repeat Yourself)
Flexibilidade
Escalabilidade
Documentação
Testes
Command Line FrameworksCommand Line Frameworks
App::CLI
App::Cmd
CLI::Dispatch
CLI::Framework
App::RadApp::Rad
App::RadApp::Rad
Simples (e fácil) de instalar e usar
Leve!
Facilmente extensível
Integração com one-liners
Meu primeiro programaMeu primeiro programa
use App::Rad;use App::Rad;
App::Rad->run;App::Rad->run;
Meu primeiro programaMeu primeiro programa
> ./meuprog.plUsage: ./meuprog.pl command [arguments]
Available Commands: help show syntax and available commands
>
Adicionando versãoAdicionando versão
use App::Rad;use App::Rad;
App::Rad->run;App::Rad->run;
Adicionando versãoAdicionando versão
use App::Rad;use App::Rad;
App::Rad->run;App::Rad->run;
our $VERSION = '0.1.1-pre-alfa';our $VERSION = '0.1.1-pre-alfa';
Executando novamenteExecutando novamente
> ./meuprog.plmeuprog.pl version 0.1.1prealfaUsage: ./meuprog.pl command [arguments]
Available Commands: help show syntax and available commands
> ./meuprog.pl versionmeuprog.pl version 0.1.1prealfa
>
Criando ComandosCriando Comandos
use App::Rad;App::Rad>run;
sub hello { return “Hello, World!”;}
Criando ComandosCriando Comandos
> ./meuprog.plUsage: ./meuprog.pl command [arguments]
Available Commands: hello help show syntax and available commands
> ./meuprog.pl helloHello, World!
>
Criando Comandos Mais InteressantesCriando Comandos Mais Interessantes
use App::Rad;App::Rad>run;
sub roll :Help(roll a dice in AdX format) { my $c = shift; my $value = 0;
if ( $c>argv>[0] =~ m{(\d+)d(\d+)} ) { for (1..$1) { $value += int(rand($2) + 1); } } return $value;}
Criando Comandos Mais InteressantesCriando Comandos Mais Interessantes
> ./meuprog.plUsage: ./meuprog.pl command [arguments]
Available Commands: help show syntax and available commands roll roll a dice in AdX format
> ./meuprog.pl roll 3d47
>
Argumentos SimplesArgumentos Simples
@ARGV
$c->options
$c->argv
$c->getopt
Argumentos ExplícitosArgumentos Explícitos
sub setup { my $c = shift;
$c>register_commands({ cmd1 => { arg1 => { type => 'num', condition => sub { $_ < 3 }, required => 1, }, arg2 => { type => 'str' }, } } }}
Fluxo do programaFluxo do programa
Funções de ControleFunções de Controle
setup()
pre_process()
post_process()
teardown()
Compartilhando dados (stash)Compartilhando dados (stash)sub command { my $c = shift; my $ret = do_something();
if ( $ret =~ /critical error/ ) { $c->stash->{mail} = 1; } return $ret; }
sub post_process { my $c = shift;
if ( $c->stash->{mail} ) { # send email alert... } else { print $c->output . "\n"; } }
““include” && “exclude”include” && “exclude”
Comandos embutidos
Manipulação de one-liners!
Ambos “opt-in”
use App::Rad qw(include exclude);
““include” && “exclude”include” && “exclude”
> perl e 'print “FISL!\n”'FISL!
> ./meuprog.pl include e 'print “FISL!\n”'
> ./meuprog.pl helpUsage: ./meuprog.pl command [arguments]
Available Commands: cmd1 include help exclude
““include” && “exclude”include” && “exclude”
> ./meuprog.pl cmd1FISL!
(enquanto isso, em meuprog.pl...)
sub cmd1 { my $c = shift; print “FISL!\n”;}
Exemplos mais convincentesExemplos mais convincentes
Pegamos um one-liner “místico”...
> perl i paF, le 'splice @F,1,0,$.;$_=join “,”,@F' planilha.csv
Fazemos uma substituição simples...
> ./meuprog.pl include adiciona_colunai paF, le 'splice @F,1,0,$.; $_=join “,”,@F'
e voilá!
> ./meuprog.pl adiciona_coluna planilha.csv
(algumas) funções auxiliares(algumas) funções auxiliares
commands()
is_command( NOME )
register( NOME, CODEREF )
unregister( NOME )
load_config( ARQUIVO)
Modo “shell” (REPL)Modo “shell” (REPL)
use App::Rad;use App::Rad;
App::Rad->run;App::Rad->run;
Modo “shell” (REPL)Modo “shell” (REPL)
use App::Rad;use App::Rad;
App::Rad->shell;App::Rad->shell;
Modo “shell” (REPL)Modo “shell” (REPL)
> ./meuprog.plmeuprog> helpAvailable Commands: help show syntax and available commands quit exits the program roll roll a dice in AdX formatmeuprog> roll 2d109meuprog> quit
>
Plugins!Plugins!
Prontos:
● TT● ConfigLoader
Em andamento:
● Log4perl● Daemon● ...?
Extensões!Extensões!
MooseX::App::RadMooseX::App::Rad
(em andamento)(em andamento)
Módulos interessantes de usarMódulos interessantes de usar
Sysadm::Install
PUNC (Perl Unified Network Controller)
Net::Server
IPC::Cmd
IO::Prompt
Term::Menu
Onde encontrarOnde encontrar
Código estável+documentação: CPAN
Bleeding-edge: http://github.com/garu/App-Rad/
Discussão: #app-rad em irc.perl.org
Compartilhe sua idéia!Compartilhe sua idéia!
Estaremos no stand de Perl durante todo o evento!
Obrigado!Obrigado!
Dúvidas?Dú[email protected]