<div dir="ltr">Frederico, isso é uma missão para o Mestre Eden ... :-)<div style>Abs,</div><div style>Marcio.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">Em 10 de abril de 2013 11:40, Frederico Melo <span dir="ltr"><<a href="mailto:fdmmelo@gmail.com" target="_blank">fdmmelo@gmail.com</a>></span> escreveu:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div><br></div>Fala Márcio! <br></div>Consegui avançar com a ajuda de vocês! Mas ainda preciso de algumas dicas. Realmente não tenho os conhecimentos necessários no perl e no expect para avançar ainda mais. Fiquei preso em uma situação onde preciso capturar mais de um dado na tela que a função ascii do s3270 retorna pelo expect. Li e reli suas dicas e as do Eden mas, não consigo ir além... Acredito que o problema aqui é no meu entendimento das funções, das subs e nas rotinas dentro do expect. <br>


<br></div>O ascii retorna a seguinte string:<br><br></div><span style="font-family:courier new,monospace">data:<br>data:         APLNC000             *** SUBSISTEMA APL ***               MMM2D000<br>data:         09/04/2013           CONSULTA DE LOCALIDADES              15:46:09<br>


data:<br>data:        SIGLA.........: XYZ                            <span style="color:rgb(255,0,0)"><b>NUMERO DO COD.: 0DD</b></span><br>data:<br>data:        <span style="color:rgb(11,83,148)"><b>LOCALIDADE....: XISYPSZE</b></span><br>

data:<br>data:        MUNICIPIO.....: XISYPS<br>data:<br>data:        <br>
data:<br>data:        CONCES: CONCESSOR<br>data:<br>data:        CODIGO DA TOT.: DD<br>data:<br>data:        <br>data:<br>data:        <br>data:<br>data:                        ESTA LOCALIDADE E' ABERTA<br>
data:<br>data:<br>data:</span><br><br></div><div>Na tela acima, gostaria de pegar os dados LOCALIDADE e guardar em $loc e NUMERO DO COD, guardar em $cod<br></div>Meu código, está da seguinte maneira:<br><br></div><span style="font-family:courier new,monospace"><code><br>

<br></span></div><div><span style="font-family:courier new,monospace">$exp->send($cmd1);<br></span></div><div><span style="font-family:courier new,monospace">$exp->expect(5, [<br><br>                qr/data:\s+<span style="color:rgb(11,83,148)"><b>LOCALIDADE</b></span>(.+)/ => sub {<br>

                              my $self = shift;<br>                              my($rr1) = $self->match;<br>                              my $rp="";<br>                              $loc=$rr1;<br>                              $loc = substr($rr1,6,55);<br>

                              $loc =~ s/\s//g;<br>                              print "\n\n$loc\n\n";<div class="im"><br>                              exp_continue; # manda continuar<br>                                                  },<br>
</div>
               qr/data:\s+(.+)<span style="color:rgb(255,0,0)"><b>NUMERO</b></span>\s+(.+)/ => sub {<br>                              my $self = shift;<br>                              my($cod) = $self->match;<br>                              print "\ncod=xxx$codxxx\n";<div class="im">
<br>
                              exp_continue;<br>                                                 },<br><br>                   # quantas expressões você quiser/precisar<br><br>                   timeout => sub { die 'o sistema parou de responder' }<br>

                  ]<br>            );<br></div></span></div><div><span style="font-family:courier new,monospace"><br></span></div><span style="font-family:courier new,monospace"><code></span><br><div><div><br></div>
<div>O primeiro print funciona ok e tenho o retorno correto de $loc mas, o segundo print para $cod não funciona e não traz nada. Posso fazer as subs acima? A variável $self é especial do perl? O shift que usei na primeira regex vai afetar a segunda chamada para regex? Realmente me falta conhecimento para entender. Por favor, me ajude. Obrigado novamente pela sua atenção.<br>

</div><div><br></div><div>Abcs,<br></div><div>Frederico<br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote"><div class="im">
2013/3/25 Marcio - Google <span dir="ltr"><<a href="mailto:marciorp@gmail.com" target="_blank">marciorp@gmail.com</a>></span><br></div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


Fala Frederico,<div><br></div><div>Vamos lá. Na própria thread o Eden da ótimos exemplos, vou reproduzi-los aqui e tentar explicar.</div><div><br></div><div>O primeiro que usei foi esse aqui:</div><div><br></div><div><code></div>



<div><div>$exp->send(cmd1$); ##To enviando o comando</div><div><br></div><div>$exp->expect(100, [qr/.{1920}/ => sub {</div><div>                                          my($self) = @_;</div><div>                                          print $self->match; </div>



<div>                                      }</div><div>                  ]</div><div>            );</div><div><code></div><div><br></div><div>Como você mesmo disse, a tela tem 80x24, ou sejam 1920 caracteres, o que inclui espaços.</div>



<div>$exp->expect( ##Lê o retorno</div><div>O primeiro parâmetro é o timeout</div><div>O segundo é uma regex, que nesse caso espera 1920 caracteres. Se receber isso, vai executar a sub e a sua "tela" vai estar na variável $self. Ai você tem que garimpar os dados nessa "stringona", tipo, copiar pedaços dela que contenham os dados que você quer.</div>



<div><br></div><div><br></div><div>Bom, depois passei para outro mais refinado:</div><div><br></div><div><code></div><div><div> $exp->send($cmd1); </div><div> $exp->expect(100, [</div><div>                    qr/resposta cmd1: (.+)/ => sub {</div>



<div>                                                       my $self = shift;</div><div><br></div><div>                                                       # $resposta vai ter o que casou com (.+) - Aqui você coloca algo que você esteja esperando</div>



<div>                                                       # Digamos que a informação que você querer seja precedida de <Nome:>, então é isso que você está esperando</div><div>                                                       my($resposta) = $self->match_list;</div>



<div><br></div><div>                                                       # Aqui você guarda a informação no banco de dados ou qualquer outro processamento</div><div><br></div><div>                                                       # enviar segundo comando, para pegar outra informação, p.e.</div>



<div>                                                       $self->send($cmd2);</div><div><br></div><div>                                                       exp_continue; # manda continuar</div><div>                                                   },</div>



<div>                    qr/resposta cmd2: (.+)/ => sub {</div><div>                                                       my $self = shift;</div><div>                                                       my($resposta) = $self->match_list;</div>



<div><br></div><div>                                                       # etc...</div><div><br></div><div>                                                       exp_continue;</div><div>                                                   },</div>



<div><br></div><div>                    # quantas expressões você quiser/precisar</div><div><br></div><div>                    timeout => sub { die 'o sistema parou de responder' }</div><div>                   ]</div>



<div>             );</div></div><div><code></div><div><br></div><div>Nesse caso ai você vai esperar por expressões especificas, e cada vez que elas coincidirem o código da sub será processado. Eu pelo menos acabei achando mais fácil assim do que pegar uma "stringona" e ficar procurando dados dentro dela.</div>



<div><br></div><div>Pra cada vez que você enviar ($exp->send()) você precisa processar o retorno ($exp->expect()).</div><div>O retorno é sempre uma string ou timeout. Você só tem que escolher como quer processar essa string.</div>



<div><br></div><div>Se tiver mais dúvidas vai postando que vamos tentando ajudar.</div><div><br></div><div>[...]´s</div><div><br></div><div>Marcio</div><br><div class="gmail_quote">Em 25 de março de 2013 16:13, Frederico Melo <span dir="ltr"><<a href="mailto:fdmmelo@gmail.com" target="_blank">fdmmelo@gmail.com</a>></span> escreveu:<div>


<div><br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Oi Márcio, tudo bem?<br><br>Voltei! Então... após várias tentativas, debugs e verificação de logs, consegui navegar pelo servidor IBM através do Perl com Expect. Muito legal mesmo! Obrigado pelas dicas iniciais! Agora, cheguei na fase de capturar algumas informações e gravá-las em banco de dados.<br>




<br>Vejo nos arquivos de logs o resultado da função ascii do s3270. Como faço para pegar alguns dados (não é o print da tela 0,0,24,80 completo) e armazeno em banco? Pelo Perl e Expect isso é possível de ser feito no mesmo tempo que navega-se pelas telas do MainFrame IBM?<br>




<br>Hoje meu código é algo assim:<br><br><br><span style="font-family:courier new,monospace">#!/usr/bin/perl<br><br>my @s3270 = s3270;<br><br>use strict;<br>use warnings;<br>use Expect;<div><br><br>my $exp = Expect->spawn('s3270');<br>




<br></div>$exp->log_file('teste.log');<br><br>my $cmd1 = "connect(<a href="http://12.234.123.3:23" target="_blank">12.234.123.3:23</a>)\n";<br>$cmd1 .= "wait(InputField)\n";<br>$cmd1 .= "String(username)\n";<br>




$cmd1 .= "Enter()\n";<br>$cmd1 .= "wait(InputField)\n";<br>$cmd1 .= "String(password)\n";<br>$cmd1 .= "Enter()\n";<br>$cmd1 .= "wait(InputField)\n";<br>$cmd1 .= "String(APL)\n";<br>




$cmd1 .= "Enter()\n";<br>$cmd1 .= "wait(InputField)\n";<br>$cmd1 .= "String(CODAPL)\n";<br>$cmd1 .= "Enter()\n";<br>$cmd1 .= "pf(3)\n"; #TELA INCIAL APL -> VAI PARA CONSULTAS<br>




$cmd1 .= "wait(InputField)\n";<br>$cmd1 .= "String(14)\n";<br>$cmd1 .= "Enter()\n";<br>$cmd1 .= "wait(InputField)\n";<br>$cmd1 .= "String(01)\n";<br>$cmd1 .= "Enter()\n";<br>




$cmd1 .= "String(ordemserv12tt)\n";<br>$cmd1 .= "Enter()\n";<br>$cmd1 .= "Ascii(0,0,24,80)\n";<br></span><br>Neste ponto, tenho a tela impressa em memória e no log. Como faço, nessa etapa, para capturar alguns dados e armazená-los em banco? Não tenho dificuldades em utilizar DBD ou DBI no perl, minha dificuldade é interagir o perl com os retornos do s3270 e expect. Seria possível me auxiliar? Já agradeço pelo precioso apoio1<br>




<br>Obrigado novamente!<span><font color="#888888"><br>Frederico<br><br><br></font></span><div class="gmail_quote"><div><div>2013/3/21 Marcio - Google <span dir="ltr"><<a href="mailto:marciorp@gmail.com" target="_blank">marciorp@gmail.com</a>></span><br>



</div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>
<p>Tiago, nesse caso não. A função "string" é do s3270, e ele entende tudo de forma literal. Também tropecei nisso.</p>
<p>Frederico, isso. Se não me engano, para "entrar" o comando é ENTER.<br>
Se não funcionar posta novamente que vou ver com fiz.</p>
<br></div></div><div>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></div></blockquote></div><br>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div></div></div><br><br></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div></div></div><br></div></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><br>[...]'s<br><br>Marcio
</div>