SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Desenvolvimento
Rápido de Programas
 Linha de Comando

      Breno G. de Oliveira
        breno@rio.pm.org
Ferramentas Linha de Comando

 Tradicionais
        ● Exibição de ajuda (“help”)
        ● Parsing de argumentos




 Orientada a comandos
        ● Dispatcher
        ● Help específico

        ● Shell
Dicotomia do Perl



          linguagem
               X
          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 para
 solucionar problemas de forma rápida e eficiente
 (ou deveriam usar)
Problemas com One-liners
(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 Tradicional



      Getopt::Long + Pod::Usage



        Eficiente para programas lineares,
               mas não escala bem.
Frameworks


     DRY (Don't Repeat Yourself)

     Flexibilidade

     Escalabilidade

     Documentação

     Testes
Command Line Frameworks


     App::CLI

     App::Cmd

     CLI::Dispatch

     CLI::Framework
App::Rad
App::Rad


     Simples (e fácil) de instalar e usar

     Leve!

     Facilmente extensível

     Integração com one-liners
Meu primeiro programa



     use App::Rad;
     App::Rad->run;
Meu primeiro programa

> ./meuprog.pl
Usage: ./meuprog.pl  command [arguments]

Available Commands:
   help    show syntax and available commands

>
Adicionando versão



     use App::Rad;
     App::Rad->run;
Adicionando versão



     use App::Rad;
     App::Rad->run;

     our $VERSION = '0.1.1-pre-alfa';
Executando novamente

> ./meuprog.pl
meuprog.pl version 0.1.1­pre­alfa
Usage: ./meuprog.pl  command [arguments]

Available Commands:
   help    show syntax and available commands

> ./meuprog.pl ­­version
meuprog.pl version 0.1.1­pre­alfa

>
Criando Comandos

  use App::Rad;
  App::Rad­>run;

  sub hello {
     return “Hello, World!”;
  }
Criando Comandos

> ./meuprog.pl
Usage: ./meuprog.pl  command [arguments]

Available Commands:
   hello
   help    show syntax and available commands

> ./meuprog.pl hello
Hello, World!

>
Criando 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 Interessantes

> ./meuprog.pl
Usage: ./meuprog.pl  command [arguments]

Available Commands:
   help   show syntax and available commands
   roll   roll a dice in AdX format

> ./meuprog.pl  roll  3d4
7

>
Argumentos Simples


      @ARGV

      $c->options

      $c->argv

      $c->getopt
Argumentos Explícitos

 sub setup {
      my $c = shift;

      $c­>register_commands({
            cmd1  => { arg1 => { 
                            type      => 'num',
                            condition => sub { $_ < 3 },
                            required  => 1,
                       },
                       arg2 => {
                            type      => 'str'
                       },
                     }
            }
     }
 }
Fluxo do programa
Funções de Controle


       setup()

       pre_process()

       post_process()

       teardown()
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”


   Comandos embutidos

   Manipulação de one-liners!

   Ambos “opt-in”

   use App::Rad qw(include exclude);
“include” && “exclude”

  > perl ­e 'print “FISL!n”'
  FISL!

  > ./meuprog.pl include ­e 'print “FISL!n”'

  > ./meuprog.pl help
  Usage: ./meuprog.pl command [arguments]

  Available Commands:
     cmd1
     include
     help
     exclude
“include” && “exclude”

  > ./meuprog.pl cmd1
  FISL!


  (enquanto isso, em meuprog.pl...)

  sub cmd1 {
     my $c = shift;
     print “FISL!n”;
  }
Exemplos 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_coluna
­i ­paF, ­le 'splice @F,1,0,$.; $_=join “,”,@F'

e voilá!

> ./meuprog.pl  adiciona_coluna  planilha.csv
(algumas) funções auxiliares

   commands()

   is_command( NOME )

   register( NOME, CODEREF )

   unregister( NOME )

   load_config( ARQUIVO)
Modo “shell” (REPL)



     use App::Rad;
     App::Rad->run;
Modo “shell” (REPL)



     use App::Rad;
     App::Rad->shell;
Modo “shell” (REPL)

> ./meuprog.pl
meuprog> help
Available Commands:
   help   show syntax and available commands
   quit   exits the program
   roll   roll a dice in AdX format
meuprog> roll 2d10
9
meuprog> quit

>
Plugins!

      Prontos:

           ● TT
           ● ConfigLoader




      Em andamento:

           ● Log4perl
           ● Daemon

           ● ...?
Extensões!



         MooseX::App::Rad
             (em andamento)
Módulos interessantes de usar

     Sysadm::Install

     PUNC (Perl Unified Network Controller)

     Net::Server

     IPC::Cmd

     IO::Prompt

     Term::Menu
Onde 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!




       Estaremos no stand de Perl
         durante todo o evento!
Obrigado!
Dúvidas?
  breno@rio.pm.org

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

PHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesPHP Day - PHP para iniciantes
PHP Day - PHP para iniciantes
 
Java script aula 08 - formulários
Java script   aula 08 - formuláriosJava script   aula 08 - formulários
Java script aula 08 - formulários
 
Zephir
ZephirZephir
Zephir
 
O que há de novo no PHP 5.3
O que há de novo no PHP 5.3O que há de novo no PHP 5.3
O que há de novo no PHP 5.3
 
Al sweigart, cap 3
Al sweigart, cap 3Al sweigart, cap 3
Al sweigart, cap 3
 
M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Web
 
SIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHPSIMCIT 2013 - Mini-curso PHP
SIMCIT 2013 - Mini-curso PHP
 
Manual-de-php
Manual-de-phpManual-de-php
Manual-de-php
 
Shell Script
Shell ScriptShell Script
Shell Script
 
Aula3
Aula3Aula3
Aula3
 
Curso Gratuito de Shell Script
Curso Gratuito de Shell ScriptCurso Gratuito de Shell Script
Curso Gratuito de Shell Script
 
Java script aula 02 - operadores
Java script   aula 02 - operadoresJava script   aula 02 - operadores
Java script aula 02 - operadores
 
Docker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHONDocker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHON
 
Funcao PHP
Funcao PHPFuncao PHP
Funcao PHP
 
Oficina de shell script
Oficina de shell scriptOficina de shell script
Oficina de shell script
 
PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX
 
Shell script
Shell scriptShell script
Shell script
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Oficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScriptOficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScript
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)
 

Similar a Desenvolvimento Rápido de Programas Linha de Comando com App::Rad

Similar a Desenvolvimento Rápido de Programas Linha de Comando com App::Rad (20)

Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
Guia Rápido Voyage 200
Guia Rápido Voyage 200Guia Rápido Voyage 200
Guia Rápido Voyage 200
 
Sapo sessions linux power tools
Sapo sessions linux power toolsSapo sessions linux power tools
Sapo sessions linux power tools
 
aula5_python.pdf
aula5_python.pdfaula5_python.pdf
aula5_python.pdf
 
Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhany
 
Linux shell
Linux shellLinux shell
Linux shell
 
Python No Terra (2006-12-21)
Python No Terra  (2006-12-21)Python No Terra  (2006-12-21)
Python No Terra (2006-12-21)
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Palestra Ruby
Palestra RubyPalestra Ruby
Palestra Ruby
 
Guia Rápido Voyage 200
Guia Rápido Voyage 200Guia Rápido Voyage 200
Guia Rápido Voyage 200
 
Cherrypy - um framework para desenvolvimento rápido de aplicações web
Cherrypy - um framework para desenvolvimento rápido de aplicações webCherrypy - um framework para desenvolvimento rápido de aplicações web
Cherrypy - um framework para desenvolvimento rápido de aplicações web
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Introdução a php
Introdução a phpIntrodução a php
Introdução a php
 
Ecossistema Python
Ecossistema PythonEcossistema Python
Ecossistema Python
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECL
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 

Más de garux

Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6garux
 
Descobrindo a linguagem Perl
Descobrindo a linguagem PerlDescobrindo a linguagem Perl
Descobrindo a linguagem Perlgarux
 
Communities - Perl edition (RioJS)
Communities - Perl edition (RioJS)Communities - Perl edition (RioJS)
Communities - Perl edition (RioJS)garux
 
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensa
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensaSeja um Perl Core Hacker - é (muito) mais fácil do que você pensa
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensagarux
 
Game Development with SDL and Perl
Game Development with SDL and PerlGame Development with SDL and Perl
Game Development with SDL and Perlgarux
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4garux
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3garux
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2garux
 
Perl Moderno, dia1
Perl Moderno, dia1Perl Moderno, dia1
Perl Moderno, dia1garux
 
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao MooseOrientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moosegarux
 
Perl Quiz 2009 (YAPC::BR)
Perl Quiz 2009 (YAPC::BR)Perl Quiz 2009 (YAPC::BR)
Perl Quiz 2009 (YAPC::BR)garux
 
Jogos em Perl
Jogos em PerlJogos em Perl
Jogos em Perlgarux
 
Logging e depuração enterprise-level com Log4perl
Logging e depuração enterprise-level com Log4perlLogging e depuração enterprise-level com Log4perl
Logging e depuração enterprise-level com Log4perlgarux
 
Novidades no Perl 5.10
Novidades no Perl 5.10Novidades no Perl 5.10
Novidades no Perl 5.10garux
 

Más de garux (15)

Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6
 
Descobrindo a linguagem Perl
Descobrindo a linguagem PerlDescobrindo a linguagem Perl
Descobrindo a linguagem Perl
 
Communities - Perl edition (RioJS)
Communities - Perl edition (RioJS)Communities - Perl edition (RioJS)
Communities - Perl edition (RioJS)
 
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensa
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensaSeja um Perl Core Hacker - é (muito) mais fácil do que você pensa
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensa
 
Game Development with SDL and Perl
Game Development with SDL and PerlGame Development with SDL and Perl
Game Development with SDL and Perl
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2
 
Perl Moderno, dia1
Perl Moderno, dia1Perl Moderno, dia1
Perl Moderno, dia1
 
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao MooseOrientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
 
Perl Quiz 2009 (YAPC::BR)
Perl Quiz 2009 (YAPC::BR)Perl Quiz 2009 (YAPC::BR)
Perl Quiz 2009 (YAPC::BR)
 
Jogos em Perl
Jogos em PerlJogos em Perl
Jogos em Perl
 
Logging e depuração enterprise-level com Log4perl
Logging e depuração enterprise-level com Log4perlLogging e depuração enterprise-level com Log4perl
Logging e depuração enterprise-level com Log4perl
 
Novidades no Perl 5.10
Novidades no Perl 5.10Novidades no Perl 5.10
Novidades no Perl 5.10
 

Desenvolvimento Rápido de Programas Linha de Comando com App::Rad