[SP-pm] Ajuda com módulo DBI::mysql e funcoes.

Blabos de Blebe blabos at gmail.com
Sat Mar 13 10:26:23 PST 2010


Eu acho o perl-tidy uma ótima ferramenta complementar, mas não
recomendaria como cura para os males do mal estilo.

Código pra mim é como caligrafia. Uma prática que você aprimora com o tempo.

Acho que o bom código tem que ter eficiência e beleza, em maior ou
menor grau dependendo do caso, não porque alguém assim determina, mas
por ser um reflexo de nossa arte.

A maioria das IDEs hoje são configuráveis ao ponto de nos facilitar a
vida nesse aspecto.

O perl-tidy pode ainda ser configurado junto com hooks dos SCV mais
modernos para inclusive impedirem commits fora do padrão. Opções não
faltam.

Abraços

2010/3/13 Samir Cury <eu em samircury.eng.br>:
> Dica maneira pra resolver problema de boas práticas na aparência do código :
>
> perl-tidy :
>
> http://samircury.eng.br/blog/?p=9
>
> Abraços,
> Samir
>
> 2010/3/13 jefferson alexandre <jefferson.alexandre em gmail.com>:
>>
>>
>> 2010/3/13 Otávio Fernandes <otaviof em gmail.com>
>>>
>>> 2010/3/13 jefferson alexandre <jefferson.alexandre em gmail.com>:
>>> > Bom dia a todos.
>>> > Primeiramente, gostaria de parabenizar aos membros da lista pela
>>> > educação e
>>> > respeito com os usuários, independente do nível de conhecimento.  É
>>> > legal
>>> > ver que ainda existem listas nacionais que vale a pena frequentar, e
>>> > esta é
>>> > uma delas. :D
>>> > Recentemente, consegui introduzir o perl no meu ambiente de trabalho,
>>> > criando algumas ferramentas para manutenção e administração de
>>> > servidores
>>> > Asterisk. (PABX IP Open Source.)
>>> > Eu tenho pouca ou quase nenhuma experiência com programação. No máximo,
>>> > alguns scripts shell que estão sendo devidamente portados/reescritos em
>>> > Perl.
>>> > Eu criei uma rotina para o Asterisk para que, quando um usuário disparar
>>> > uma
>>> > ligação, meu script ira consultar o numero digitado pelo usuário com uma
>>> > base de dados mysql, e então, mediante resultado, ira passar o controle
>>> > de
>>> > volta para o asterisk, para que ele complete ou não a ligação. Essa
>>> > solução
>>> > será instalada em Callcenters de São Paulo para cumprir esta
>>> > lei: http://www.procon.sp.gov.br/noticia.asp?id=934
>>> >
>>> > O meu problema é, que independente do numero passado pelo asterisk, meu
>>> > script sempre retorna 0 para a função &consulta_banco, e acaba
>>> > bloqueando a
>>> > ligação.
>>> > Eu acredito que poderia resolver isso comparando o valor de $var em um
>>> > if,
>>> > mas eu gostaria de entender como resolver isso apenas usando o retorno
>>> > da
>>> > função, se este for o modo correto de fazer isso.
>>> > Abaixo, o código:
>>> > ++ Begin Code ++
>>> > #!/usr/bin/perl -w
>>> > use DBI();
>>> > use Asterisk::AGI;
>>> > $AGI = new Asterisk::AGI;
>>> > ($database, $host, $user, $pw) = qw( procon 127.0.0.1 usuario senha );
>>> > #Obter numero discado  via AGI. Deve retornar algo como (01112345678) ;
>>> > $EXTEN = $AGI->get_variable('EXTEN') ;
>>> >
>>> > if ( &consulta_banco($EXTEN) )  {
>>> > #Colocando o valor "1" na variavel FORBIDEN, que será tratada pelo
>>> > asterisk,
>>> > e imprimindo na tela.
>>> >         $AGI->set_variable("FORBIDEN", "1");
>>> > $AGI->verbose("Numero consta na lista do Procon-SP") ;
>>> > }
>>> > else {
>>> > $AGI->set_variable("FORBIDEN", "0") ;
>>> > $AGI->verbose("Executando ligacao para $EXTEN") ;
>>> > }
>>> > #Consultando banco de dados.
>>> > sub consulta_banco {
>>> > $dbh = DBI->connect("DBI:mysql:database=$database;host=$host", $user,
>>> > $pw )
>>> >  || die print $DBI::errstr;
>>> >          $dbh->{RaiseError} = 1;
>>> > $sth = $dbh->prepare(" SELECT numero FROM numeros WHERE numero LIKE
>>> > \"%$_[0]%\" ");
>>> >          $sth->execute() ;
>>> > }
>>> > ++ End Code ++
>>> > Obrigado,
>>> > _______________________________________________
>>> > SaoPaulo-pm mailing list
>>> > SaoPaulo-pm em pm.org
>>> > http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>>
>>> Jefferson,
>>>
>>> Em nome da lista eu lhe agradeço pelo elogio, é muito importante para
>>> nós termos este tipo de feedback. Muito obrigado!
>>>
>>> Pelo seu código, fica evidente que você te pouca experiência me
>>> desenvolvimento, mas este é um problema que nós podemos resolver aqui
>>> na lista, é apenas uma questão de tempo.
>>>
>>> Alguns pontos são bastante falhos no seu código, dentre eles:
>>>    * "use scrict";
>>>    * Uso do DBI diretamente;
>>>    * Cuidados com a indentação;
>>>    * Não ter testes automatizados (estou supondo isso);
>>>
>>> Segue um exemplo de como ele pode ser melhorado (acredito que ele já
>>> deve até funcionar corretamente agora):
>>>
>>> #!/usr/bin/env perl
>>>
>>> use strict;
>>> use warnings;
>>>
>>> use DBI();
>>> use Asterisk::AGI;
>>>
>>> #
>>> ---------------------------------------------------------------------------
>>> #                                Subroutines
>>> #
>>> ---------------------------------------------------------------------------
>>>
>>> sub consulta_banco {
>>>    my ($number) = @_;
>>>
>>>    my $dbh
>>>        = DBI->connect( "DBI:mysql:database=" . $database . ";host=" .
>>> $host,
>>>        $user, $pw )
>>>        or die $!;
>>>    $dbh->{RaiseError} = 1;
>>>
>>>    my $sth;
>>>    eval {
>>>        $sth
>>>            = $dbh->prepare( "
>>>        SELECT
>>>            numero
>>>        FROM
>>>            numeros
>>>        WHERE
>>>            numero LIKE \"%$number%\"
>>>        " );
>>>
>>>    };
>>>    die $@ if $@;
>>>
>>>    return 0 if ( !$sth );
>>>    return 0 if ( !$sth->execute() );
>>>
>>>    my $numeros = $sth->fetchrow_hashref;
>>>
>>>    $sth->finish();
>>>
>>>    return 1 if ( $numeros->{numero} );
>>>    return 0;
>>> }
>>>
>>> #
>>> ---------------------------------------------------------------------------
>>> #                                -- Main --
>>> #
>>> ---------------------------------------------------------------------------
>>>
>>> my $agi = new Asterisk::AGI;
>>>
>>> my ( $database, $host, $user, $pw ) = qw( procon 127.0.0.1 usuario senha
>>> );
>>>
>>> # obter numero discado  via AGI, deve retornar algo como (01112345678)
>>> my $exten = $agi->get_variable('EXTEN');
>>>
>>> if ( consulta_banco($exten) ) {
>>>    # colocando o valor "4" na variavel FORBIDEN, que será tratada pelo
>>>    # asterisk, e imprimindo na  tela.
>>>    $agi->set_variable( "FORBIDEN", "1" );
>>>    $agi->verbose("Numero consta na lista do Procon-SP");
>>> } else {
>>>    $agi->set_variable( "FORBIDEN", "0" );
>>>    $agi->verbose("Executando ligacao para $exten");
>>> }
>>>
>>> __END__
>>>
>>> O único problema que impedira do seu script funcionar corretamente,
>>> independente da qualidade, é o uso incorreto da DBI, na função
>>> "consulta_banco" eu coloquei a forma correta de como lidar com ele.
>>> Apenas um exemplo.
>>>
>>> Para melhorar os pontos citados acima, recomendo fortemente as leituras:
>>>
>>> http://perldoc.perl.org/strict.html
>>> http://perldoc.perl.org/warnings.html
>>> http://sao-paulo.pm.org/equinocio/2010/mar/11
>>> http://sao-paulo.pm.org/equinocio/2010/mar/12
>>> http://en.wikipedia.org/wiki/Test-driven_development
>>> http://www.agiledata.org/essays/tdd.html
>>> http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm
>>>
>>> Aproveitando o ensejo, segue dentre os links um artigo do Eden
>>> publicado no Equinócio de Março, o qual é muito completo e vai lhe
>>> ajudar muito.
>>>
>>> um abraço,
>>>
>>> --
>>> Otávio Fernandes <otaviof at gmail.com>
>>> http://blog.emresumo.com
>>> _______________________________________________
>>> SaoPaulo-pm mailing list
>>> SaoPaulo-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>> Jorge, Otávio, obrigado pelas respostas. O programa agora está faz o que ele
>> deve fazer :D
>> Otávio, realmente, eu não tenho experiência com desenvolvimento, apenas um
>> ou outro script para resolver problemas na area de Sysadmin.  O
>> relacionamento com Perl surgiu depois de eu perder a paciencia com programa
>> que estava sendo escrito em shell. :D
>> Vou ler os links com calma, e absorver este conhecimento, para poder
>> aplicá-lo nos meus programas.
>> Obrigado,
>> _______________________________________________
>> SaoPaulo-pm mailing list
>> SaoPaulo-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>


More information about the SaoPaulo-pm mailing list