<div dir="ltr">Pessoal,<br><br>Obrigado pelo interesse. Dando prosseguimento, e espero esclarecer melhor, tenho a seguinte situação:<br><br>Como o Márcio havia dito, estou acessando um mainframe IBM pelo perl e expect. O retorno que recebo do IBM são prints da sua tela, em texto puro e o perl/expect participa dessa integração analisando essas telas.<br>
<br>No meu caso, após conectar com o servidor e navegar até a tela onde devo tomar uma decisão, posso receber uma das seguintes telas, uma única vez:<br><br>1 - primeiro caso:<br><br> SELECIONE 'D' P/DETALHES<br>  ADABAS11                   *** SUBSISTEMA DETALHES ***                    ADAB11<br>
  10/02/2014                     CONSULTA DE ORDEM                       09:07:30<br>  ORDEM  : 00ABC / AAAA                                                  Pag    1<br> OP ITEM             ORDEM<br>  _ DETALHES          CASAS DOMES    <br>
<br><br><br><br><br><br><br> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---<br>                                           -PAG  +PAG                    VOLTA<br><br>2 - segundo caso:<br><br>
<br>  ADABAS11                   *** SUBSISTEMA DETALHES ***                    ADAB11<br>  10/02/2014                     CONSULTA DE ORDEM                       09:11:30<br>  ORDEM  : 00DEF / AAAA                                                  Pag    1<br>
 -------------------------------------------------------------------------------<br> <br> OBJETIVO<br> DA ORDEM.....:   ADICIONAR INFORMAÇÕES<br> <br> <br> <br> <br> REGISTRO DO<br> AUTOR:   112200  FULANO DE TAL<br> <br>
 <br> <br> Data Descr.:   02/01/2014<br> Hora Descr.:   11:22:55<br> <br> <br> <br> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---<br> CONT                                                                    VOLTA<br>
<br>Então, quando o expect lê esse print, que é um texto puro carregado na tela (ou na memória) procuro pelas strings que necessito analisar e chamo uma subrotina específica para cada caso.<br>Ex.:<br><br>Para o caso 1, procuro pela string "SELECIONE" e disparo a sub normal(); Para o caso 2, procuro pela string "OBJETIVO" e disparo a sub obj();<br>
<br>Cada sub por sua vez, executará uma série de comandos distintos de integração com o IBM. Quando executo o perl/expect isoladamente para cada caso, tudo funciona conforme o esperado. O meu problema começa quando crio um único perl, com a estrutura abaixo (fiz isso baseando na documentação do expect - <a href="http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod">http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod</a>):<br>
<br>$exp->expect(2,<br>              [ qr/\s+SELECIONE(.+)/ => \&normal()],<br>              [ qr/\s+OBJETIVO(.+)/ => \&obj()],<br>              [ qr/USUARIO nao autorizado/ => \&cancela()],<br>              [ timeout => \&cancela() ],<br>
              );<br><br>Que deveria executar, no meu leigo entendimento apenas uma chamada de subrotina para cada caso de match acima. O que está acontecendo é que o exp/perl está chamando todas as sub acima, independente do match.<br>
<br><br>Alguém saberia me explicar como funciona a estrutura abaixo, copiada da página do expect? Como ela funciona? Vejam  o que diz a documentação:<br><br>Furthermore, patterns can now be specified as array refs containing [$regexp, sub { ...}, @optional_subprams] . When the pattern matches, the subroutine is called with parameters ($matched_expect_obj, @optional_subparms). The subroutine can return the symbol `exp_continue' to continue the expect matching with timeout starting anew or return the symbol `exp_continue_timeout' for continuing expect without resetting the timeout count.<br>
<br> $exp->expect($timeout,<br>              [ qr/username: /i, sub { my $self = shift;<br>                                       $self->send("$username\n");<br>                                       exp_continue; }],<br>
              [ qr/password: /i, sub { my $self = shift;<br>                                       $self->send("$password\n");<br>                                       exp_continue; }],<br>              $shell_prompt);<br>
<br>Essa estrutura chamará todas as sub na sequência? O que devo fazer para ajustar meu código? Onde estou errando? Como adequar as estruturas acima para chamar apenas uma sub rotina dependendo do match da string? <br><br>
<br>Desde já agradeço,<br>Muito obrigado,<br>Atte.,<br>Frederico<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-04-19 22:35 GMT-03:00 Frederico Melo <span dir="ltr"><<a href="mailto:fdmmelo@gmail.com" target="_blank">fdmmelo@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Monges mestres! Obrigado pelo apoio e atenção! Estou com acesso restrito e, assim que der retorno com detalhes.<div><br>
</div><div>Márcio, espero que vc melhore! Realmente você havia iniciado esse tema de integração há algum tempo e foi por ele que iniciei meu projeto. Obrigado pelo apoio! O Eden tb ajudou demais! Agora tou emperrado... <br>

<div><br></div><div>Atte,</div><div>Frederico</div><div><div><div class="h5"><br><br>On Thursday, April 17, 2014, Tiago Peczenyj <<a href="mailto:tiago.peczenyj@gmail.com" target="_blank">tiago.peczenyj@gmail.com</a>> wrote:<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div><div class="h5"><div>se o cara vai ler da stdin ( e estamos admitindo que o cara fez um pipe para o script ) ok, mas o Expect te dá apenas a opção de controlar o timeout com processo como também é bidirecional.<br>
</div><div class="gmail_extra">


<br></div></div></div><div class="gmail_extra"><div><div class="h5">sem saber mais detalhes fica impossivel ajudar.<br><br><div class="gmail_quote">2014-04-17 17:33 GMT-03:00 Daniel de Oliveira Mantovani <span dir="ltr"><<a>daniel.oliveira.mantovani@gmail.com</a>></span>:<br>



<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Oxi, você pode fazer isso sem usar expected....<br>
<br>
given(<STDIN>) {<br>
<br>
}<br>
<br>
2014-04-17 17:31 GMT-03:00 Frederico Melo <<a>fdmmelo@gmail.com</a>>:<br>
<div><div>> Oi Daniel,<br>
><br>
> Preciso do expect pois vou interagir com o servidor. E analiso o que esse<br>
> servidor escreve em uma tela para tomar a decisão do próximo passo...<br>
><br>
> A estrutura que você sugeriu é legal mas, acho que só interagindo dentro do<br>
> perl.<br>
><br>
> Obrigado,<br>
><br>
><br>
> 2014-04-17 17:17 GMT-03:00 Daniel de Oliveira Mantovani<br>
> <<a>daniel.oliveira.mantovani@gmail.com</a>>:<br>
><br>
>> Porque você quer usar expected ? (Seja lá o que esse método que você<br>
>> não especificou de onda venha faz).<br>
>><br>
>>            given ($text) {<br>
>>                obj() when /OBJETIVO/;<br>
>>                consulta() when /CONSULTA/;<br>
>>            }<br>
>><br>
>> 2014-04-17 17:01 GMT-03:00 Tiago Peczenyj <<a>tiago.peczenyj@gmail.com</a>>:<br>
>> > nunca usei assim mas baseado neste documento:<br>
>> ><br>
>> > <a href="http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod" target="_blank">http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod</a><br>
>> ><br>
>> > vc teria que usar o exp_continue no fim de cada subrotina.<br>
>> ><br>
>> ><br>
>> > 2014-04-17 16:58 GMT-03:00 Frederico Melo <<a>fdmmelo@gmail.com</a>>:<br>
>> >><br>
>> >> Monges! Socorro!<br>
>> >> Sou bem limitado na programação em perl mas estou evoluindo com o<br>
>> >> tempo.<br>
>> >> Então desculpem pelas minhas dúvidas que para vocês, pode ser muito<br>
>> >> simples...<br>
>> >><br>
>> >> Bom, estou utilizando expect com perl e analiso alguns outputs de um<br>
>> >> servidor, em forma texto, que devo analisar e, dependendo da ocorrência<br>
>> >> de<br>
>> >> uma string, devo disparar uma determinada sub-rotina para tratativas<br>
>> >> específicas.<br>
>> >><br>
>> >> Ex.: se aparecer a string CONSULTA, devo disparar a subrotina<br>
>> >> consulta()<br>
>> >> Se aparecer a string OBJETIVO, devo disparar a subrotina obj() e assim<br>
>> >> por<br>
>> >> diante.<br>
>> >><br>
>> >> O output do servidor é verificado pelo expect e, no momento que devo<br>
>> >> tomar<br>
>> >> a decisão, a tela do output é apenas uma, com apenas uma das<br>
>> >> ocorrências<br>
>> >> abaixo.<br>
>> >><br>
>> >> Para verificar isso, estruturei o código .pl assim:<br>
>> >><br>
>> >> $exp->expect(2,<br>
>> >><br>
>> >>               [ qr/SELECIONE/ => \&select()],<br>
>> >><br>
>> >>               [ qr/OBJETIVO/ => \&obj()],<br>
>> >><br>
>> >>               [ qr/AGUARDE/ => \&sai_6()],<br>
>> >><br>
>> >>               [ qr/CONSULTA/ => \&consulta()],<br>
>> >><br>
>> >>               [ timeout => \&cancela() ],<br>
>> >><br>
>> >>               );<br>
>> >><br>
>> >> Ou seja, no meu entendimento limitado, quero que o expect dispare uma<br>
>> >> das<br>
>> >> subs acima dependendo da string que ele encontrar no output do<br>
>> >> servidor.<br>
>> >><br>
>> >> Acredito que a estrutura acima, que parece uma matriz (desculpem a<br>
>> >> ignorância), vai executar TODAS as subs independente do conteúdo do<br>
>> >> output<br>
>> >> do servidor.<br>
>> >><br>
>> >> O que está acontecendo é que o expect ou o perl só dispara a primeira<br>
>> >> sub... select()... independente da string encontrada...<br>
>> >><br>
>> >> Sei que a condição para encontrar as strings funcionam pois, fiz um<br>
>> >> perl<br>
>> >> com expect para cada condição acima e, quando rodo individualmente cada<br>
>> >> .pl,<br>
>> >> funciona certo... o que estou errando? Como devo fazer o que preciso?<br>
>> >><br>
>> >> Por favor, ajude</div></div></blockquote></div><br><br clear="all"><div><br></div></div></div><div class="">-- <br>Tiago B. Peczenyj<br>Linux User #405772<br><br><a href="http://about.me/peczenyj" target="_blank">http://about.me/peczenyj</a>
</div></div></div>
</blockquote></div></div>
</blockquote></div><br></div>