[SP-pm] Subs

Solli Honorio shonorio at gmail.com
Tue Mar 26 13:44:58 PDT 2013


Legal, se tiver dúvida de pq fiz assim ou assado, é só perguntar !

Solli Honorio


Em 26 de março de 2013 17:04, Marcio - Google <marciorp em gmail.com> escreveu:

> Solli,
>
>    Muito obrigado pelos exemplos. Estou lendo o artigo também.
>
> [...]´s
>
> Marcio
>
> Em 26 de março de 2013 09:07, Solli Honorio <shonorio em gmail.com> escreveu:
>
> > Marcio, a minha estrutura básica de script está abaixo mas recomendo
> > fortemente que você leia http://sao-paulo.pm.org/equinocio/2011/set/8
> >
> > Quando eu preciso utilizar fork, eu estou utilizando o
> > Parallel::ForkManager, pois a minha vida ficou muito mais simples.
> >
> > <code>
> > #!/usr/bin/env perl
> > use common::sense;
> > use Unix::PID;
> > use Getopt::Long;
> > use Log::Log4perl;
> > use Config::Simple;
> >
> > use sigtrap 'handler' => \&finish_process, 'INT', 'ABRT', 'QUIT', 'TERM';
> >
> > binmode STDOUT, ":utf8";
> >
> > my $VERSION = '1.00';
> > my ($logger, %CONFIG, %CHECKER);
> >
> > $CONFIG{NUM_PROCESS}  = 10;   # Numero máximo de processo
> > $CONFIG{TIMEOUT}      = 300;  # timeout nos processos
> > $CONFIG{stats}{start} = time();
> >
> > Getopt::Long::Configure('bundling');
> > GetOptions(
> >     "v|version" => sub { show_version() } ,
> >     "h|help"    => sub { help() } ,
> >     "f|file=s"  => \$CONFIG{file} ,
> > );
> >
> > check_data();
> > init_script();
> >
> > # responsável por finalizar o script de maneira correta
> > sub finish_process {
> >     $logger->info("Encerrando o processamento");
> >
> >     unlink $CONFIG{cfg}->{pid_file};
> >
> >     exit 0;
> > }
> >
> > # responsável por verificar se todos os dados fornecido
> > # via linha de comando estão corretas
> > sub check_data {
> >     for my $key ( keys %CHECKER ) {
> >         if (! $CHECKER{$key}{where}->() ) {
> >             say $CHECKER{$key}{documentation};
> >         }
> >     }
> > }
> >
> > # carrega o arquivo de configuração, inicia o log e
> > # confirma se já não está em execução.
> > sub init_script{
> >     Config::Simple->import_from( $CONFIG{file}, \%{$CONFIG{cfg}} );
> >     my $log_conf = qq(
> >         log4perl.rootLogger                = DEBUG, LOG1
> >         log4perl.appender.LOG1             = Log::Dispatch::FileRotate
> >         log4perl.appender.LOG1.filename    = $CONFIG{cfg}->{log_file}
> >         log4perl.appender.LOG1.mode        = append
> >         log4perl.appender.Log1.utf8        = 1
> >         log4perl.appender.LOG1.autoflush   = 1
> >         log4perl.appender.LOG1.max         = 31
> >         log4perl.appender.LOG1.TZ          = America/Sao_Paulo
> >         log4perl.appender.LOG1.DatePattern = yyyy-MM-dd
> >         log4perl.appender.LOG1.layout      =
> > Log::Log4perl::Layout::PatternLayout
> >         log4perl.appender.LOG1.layout.ConversionPattern = %d %p %m %n
> >     );
> >
> >     Log::Log4perl::init(\$log_conf);
> >     $logger = Log::Log4perl::get_logger();
> >
> >     Unix::PID->new()->pid_file( $CONFIG{cfg}->{pid_file} )
> >                 or die "Processo já em execução\n";
> >
> >     return 1;
> > }
> >
> > # carrega o hash checker com os parametros de verificação
> > BEGIN {
> >     %CHECKER = (
> >         file => {
> >             documentation => 'Informa a localização do arquivo de
> > configuração',
> >             required      => 1,
> >             where         => sub { return 1 if -e $CONFIG{file} },
> >         },
> >     );
> > }
> >
> > # só para garantir (ou não) a remoção do arquivo de pid
> > END {
> >    unlink $CONFIG{cfg}->{pid_file};
> > }
> >
> > </code>
> >
> >
> > Em 25 de março de 2013 16:05, Marcio - Google <marciorp em gmail.com
> >escreveu:
> >
> >> Mestres,
> >>
> >>    Obrigado por todas as dicas, foram muito valiosas.
> >>    Eu utilizo Perl para rotinas de sysadmin e implementações para
> >> Asterisk (AMI e AGI).
> >>
> >>    Hernan, nesse Equinócio acho que não consigo escrever um artigo
> ainda.
> >> Estou muito fraco, o conteúdo não séria de interesse de ninguém além de
> mim
> >> ... rsrs ... mas já estou fazendo anotações para escrever um para o
> >> próximo, só não sei se vai ser de interesse da comunidade. Será sobre
> Perl
> >> voltado para Asterisk.
> >>
> >>    Voltando ao assunto principal, para mim, pelo menos agora, a melhor
> >> opção para reutilizar o código é o que o Ricardo mostrou. Acho que é
> muita
> >> pouca coisa para criar um módulo, além do que não domino nem o básico do
> >> básico para querer me aventurar por áreas que podem me trazer mais dor
> de
> >> cabeça.
> >>
> >>    Sobre o retorno, o que o Solli colocou sobre passar uma referência
> >> para retornar as informações e no retorno mesmo voltar só se concluiu ou
> >> não me agradou bastante, pois já utilizo essa técnica em C#, mais em
> Perl
> >> não sabia como fazer.
> >>    Na questão de avisar o consumidor sobre eventuais erros, no meu caso
> é
> >> só log mesmo, pois o que faço é tudo rotina de servidor. Mais
> >> isso suscitou outra dúvida, que colocarei no final.
> >>
> >>    Também vou adotar o padrão que o Danie sugeriu para nomenclaturas
>



-- 
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130326/6505a0bb/attachment-0001.html>


More information about the SaoPaulo-pm mailing list