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