<div dir="ltr"><div class="gmail_extra">Oi Márcio, tudo bem?<br><br></div><div class="gmail_extra">Cara, desculpa amolar novamente mas, estou frustrado... Infelizmente não entendi bem a manipulação dos dados dentro da "stringona" que a função ascii do expect retorna... no seu post anterior, entendi a lógia onde você dispara uma sub para cada comando que você deseja e acho isso realmente interessante. Não entendi bem o uso da expressão regular dentro do expect  - "qr", "(.+)" - interagindo com o perl... Você pode me ajudar? Veja o que estou fazendo e o retorno que tenho do ascii do expect:<br>
<br></div><div class="gmail_extra">1 - naveguei na boa dentro do IBM e cheguei na tela onde preciso capturar os dados. O retorno do ascii do expect apresentará uma tela assim:<br><br><span style="font-family:courier new,monospace">data:    APLY0050                   *** SUBSISTEMA APL ***                    APL<br>
data:    02/04/2013                    DESCRICAO DA FICHA                       16:30:08<br>data:    FICHA  : ABCDE / CPF<br>data:   -------------------------------------------------------------------------------<br>data:   <br>
data:   OBJETIVO<br>data:   DA FICHA.....:   ORDEM VERIFICA CPF<br>data:                  URGENTE.<br>data:   <br>data:   <br>data:   <br>data:   REGISTRO DO<br>data:   AUTOR:   XX4053  NOME DO AUTOR<br>data:   <br>data:   <br>
data:   <br>data:   Data Descr.:   02/04/2013<br>data:   Hora Descr.:   10:12:13<br>data:   <br>data:   <br>data:   <br>data:   Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---<br>data:   CONT                                                                    VOLTA<br>
</span></div><div class="gmail_extra"><br></div><div class="gmail_extra">2 - preciso capturar e armazenar em variável (para posterior tratativa literária e armazenamento em banco) o trecho logo no começo das primeiras linhas, após "<span style="font-family:courier new,monospace">FICHA  :</span>" ou seja, o valor que procuro é <span style="font-family:courier new,monospace">ABCDE / CPF</span>.<br>
<br></div><div class="gmail_extra">3 - baseando no seu exemplo, desculpe novamente minha ignorância mas não entendi a parte das expressões regulares, fiz algo assim no meu código:<br><br></div><div class="gmail_extra"><code>...<br>
<br></div><div class="gmail_extra"><span style="font-family:courier new,monospace">$exp->send($cmd1); # envia sequência de comandos para chegar na tela acima<br></span></div><div class="gmail_extra"><span style="font-family:courier new,monospace">$exp->expect(10, [<br>
                 #qr/resposta cmd1: (.+)/ => sub {<br>                  <b><span style="color:rgb(204,0,0)"><span style="background-color:rgb(243,243,243)">qr/resposta cmd1: FICHA  :/ => sub {</span></span></b><br>                           my $self = shift;<br>
                           my($resposta) = $self->match_list;<br><br>                           #Aqui você guarda a informação no banco de dados ou qualquer outro processamento<br>                           print "\n\nresposta ficha=$resposta\n\n";<br>
<br>### imprimi na tela para ver mas, não apresentou nada!!!! <br>### nem a parte de texto "resposta  ficha=" SOCORRO!!! Será que nem entrou na sub ???<br><br>                              # enviar segundo comando, para pegar outra informação, p.e.<br>
<br>                              $self->send($cmd2);<br>                              exp_continue; # manda continuar<br>                                                  },<br>                   qr/resposta cmd2: (.+)/ => sub {<br>
                           my $self = shift;<br>                           my($resposta) = $self->match_list;<br><br>                           #etc...<br>                           exp_continue;<br>                                                  },<br>
                   # quantas expressões você quiser/precisar<br><br>                   timeout => sub { die 'o sistema parou de responder' }<br>                  ]<br>            );</span><br><br></div><div class="gmail_extra">
<br><br></div><div class="gmail_extra">....<code><br></div><div class="gmail_extra"><br><br></div><div class="gmail_extra">Acho que meu erro está relacionado com a falta de entedimento das tratativas 1 - "qr/" e 2 - "(.+)". Por favor Márcio, se puder me ajudar, mais uma vez serei grato.<br>
<br></div><div class="gmail_extra">Um abraço,<br></div><div class="gmail_extra">Frederico<br></div><div class="gmail_extra"><br><br><br><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">2013/3/27 Thiago Glauco <span dir="ltr"><<a href="mailto:thiagoglauco@ticursos.net" target="_blank">thiagoglauco@ticursos.net</a>></span><br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Muito bom. Mais uma ferramenta no meu canivete suíço!!!<br>
<br>
Em Ter, 2013-03-26 às 13:20 -0300, Frederico Melo escreveu:<br>
<div class=""><div class="h5">> Márcio! Muito obrigado pelas dicas! Mais uma vez sua ajuda está sendo<br>
> muito importante! Vou realizar testes antes de incomodar novamente.<br>
> Obrigado mesmo.<br>
><br>
> Frederico<br>
><br>
> 2013/3/25 Marcio - Google <<a href="mailto:marciorp@gmail.com">marciorp@gmail.com</a>><br>
>         Fala Frederico,<br>
><br>
><br>
>         Vamos lá. Na própria thread o Eden da ótimos exemplos, vou<br>
>         reproduzi-los aqui e tentar explicar.<br>
><br>
><br>
>         O primeiro que usei foi esse aqui:<br>
><br>
><br>
>         <code><br>
>         $exp->send(cmd1$); ##To enviando o comando<br>
><br>
><br>
>         $exp->expect(100, [qr/.{1920}/ => sub {<br>
>                                                   my($self) = @_;<br>
>                                                   print $self->match;<br>
>                                               }<br>
>                           ]<br>
>                     );<br>
>         <code><br>
><br>
><br>
>         Como você mesmo disse, a tela tem 80x24, ou sejam 1920<br>
>         caracteres, o que inclui espaços.<br>
>         $exp->expect( ##Lê o retorno<br>
>         O primeiro parâmetro é o timeout<br>
>         O segundo é uma regex, que nesse caso espera 1920 caracteres.<br>
>         Se receber isso, vai executar a sub e a sua "tela" vai estar<br>
>         na variável $self. Ai você tem que garimpar os dados nessa<br>
>         "stringona", tipo, copiar pedaços dela que contenham os dados<br>
>         que você quer.<br>
><br>
><br>
><br>
><br>
>         Bom, depois passei para outro mais refinado:<br>
><br>
><br>
>         <code><br>
>          $exp->send($cmd1);<br>
>          $exp->expect(100, [<br>
>                             qr/resposta cmd1: (.+)/ => sub {<br>
>                                                                my<br>
>         $self = shift;<br>
><br>
><br>
>                                                                #<br>
>         $resposta vai ter o que casou com (.+) - Aqui você coloca algo<br>
>         que você esteja esperando<br>
>                                                                #<br>
>         Digamos que a informação que você querer seja precedida de<br>
>         <Nome:>, então é isso que você está esperando<br>
><br>
>          my($resposta) = $self->match_list;<br>
><br>
><br>
>                                                                # Aqui<br>
>         você guarda a informação no banco de dados ou qualquer outro<br>
>         processamento<br>
><br>
><br>
>                                                                #<br>
>         enviar segundo comando, para pegar outra informação, p.e.<br>
><br>
>          $self->send($cmd2);<br>
><br>
><br>
><br>
>          exp_continue; # manda continuar<br>
>                                                            },<br>
>                             qr/resposta cmd2: (.+)/ => sub {<br>
>                                                                my<br>
>         $self = shift;<br>
><br>
>          my($resposta) = $self->match_list;<br>
><br>
><br>
>                                                                #<br>
>         etc...<br>
><br>
><br>
><br>
>          exp_continue;<br>
>                                                            },<br>
><br>
><br>
>                             # quantas expressões você quiser/precisar<br>
><br>
><br>
>                             timeout => sub { die 'o sistema parou de<br>
>         responder' }<br>
>                            ]<br>
>                      );<br>
>         <code><br>
><br>
><br>
>         Nesse caso ai você vai esperar por expressões especificas, e<br>
>         cada vez que elas coincidirem o código da sub será processado.<br>
>         Eu pelo menos acabei achando mais fácil assim do que pegar uma<br>
>         "stringona" e ficar procurando dados dentro dela.<br>
><br>
><br>
>         Pra cada vez que você enviar ($exp->send()) você precisa<br>
>         processar o retorno ($exp->expect()).<br>
>         O retorno é sempre uma string ou timeout. Você só tem que<br>
>         escolher como quer processar essa string.<br>
><br>
><br>
>         Se tiver mais dúvidas vai postando que vamos tentando ajudar.<br>
><br>
><br>
>         [...]´s<br>
><br>
><br>
>         Marcio<br>
><br>
>         Em 25 de março de 2013 16:13, Frederico Melo<br>
>         <<a href="mailto:fdmmelo@gmail.com">fdmmelo@gmail.com</a>> escreveu:<br>
><br>
>                 Oi Márcio, tudo bem?<br>
><br>
>                 Voltei! Então... após várias tentativas, debugs e<br>
>                 verificação de logs, consegui navegar pelo servidor<br>
>                 IBM através do Perl com Expect. Muito legal mesmo!<br>
>                 Obrigado pelas dicas iniciais! Agora, cheguei na fase<br>
>                 de capturar algumas informações e gravá-las em banco<br>
>                 de dados.<br>
><br>
>                 Vejo nos arquivos de logs o resultado da função ascii<br>
>                 do s3270. Como faço para pegar alguns dados (não é o<br>
>                 print da tela 0,0,24,80 completo) e armazeno em banco?<br>
>                 Pelo Perl e Expect isso é possível de ser feito no<br>
>                 mesmo tempo que navega-se pelas telas do MainFrame<br>
>                 IBM?<br>
><br>
>                 Hoje meu código é algo assim:<br>
><br>
><br>
>                 #!/usr/bin/perl<br>
><br>
>                 my @s3270 = s3270;<br>
><br>
>                 use strict;<br>
>                 use warnings;<br>
>                 use Expect;<br>
><br>
><br>
>                 my $exp = Expect->spawn('s3270');<br>
><br>
><br>
>                 $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<br>
>                 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>
><br>
>                 Neste ponto, tenho a tela impressa em memória e no<br>
>                 log. Como faço, nessa etapa, para capturar alguns<br>
>                 dados e armazená-los em banco? Não tenho dificuldades<br>
>                 em utilizar DBD ou DBI no perl, minha dificuldade é<br>
>                 interagir o perl com os retornos do s3270 e expect.<br>
>                 Seria possível me auxiliar? Já agradeço pelo precioso<br>
>                 apoio1<br>
><br>
>                 Obrigado novamente!<br>
>                 Frederico<br>
><br>
><br>
>                 2013/3/21 Marcio - Google <<a href="mailto:marciorp@gmail.com">marciorp@gmail.com</a>><br>
><br>
>                         Tiago, nesse caso não. A função "string" é do<br>
>                         s3270, e ele entende tudo de forma literal.<br>
>                         Também tropecei nisso.<br>
><br>
>                         Frederico, isso. Se não me engano, para<br>
>                         "entrar" o comando é ENTER.<br>
>                         Se não funcionar posta novamente que vou ver<br>
>                         com fiz.<br>
><br>
><br>
><br>
>                         =begin disclaimer<br>
>                            Sao Paulo Perl Mongers:<br>
>                         <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>
><br>
><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">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>
><br>
><br>
><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">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>
><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>
<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>
</div></div></blockquote></div><br></div></div>