[SP-pm] perl - expect

Frederico Melo fdmmelo at gmail.com
Tue Apr 22 05:57:32 PDT 2014


Pessoal,

Obrigado pelo interesse. Dando prosseguimento, e espero esclarecer melhor,
tenho a seguinte situação:

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.

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:

1 - primeiro caso:

 SELECIONE 'D' P/DETALHES
  ADABAS11                   *** SUBSISTEMA DETALHES ***
ADAB11
  10/02/2014                     CONSULTA DE ORDEM
09:07:30
  ORDEM  : 00ABC / AAAA
Pag    1
 OP ITEM             ORDEM
  _ DETALHES          CASAS DOMES







 Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
                                           -PAG  +PAG
VOLTA

2 - segundo caso:


  ADABAS11                   *** SUBSISTEMA DETALHES ***
ADAB11
  10/02/2014                     CONSULTA DE ORDEM
09:11:30
  ORDEM  : 00DEF / AAAA
Pag    1
 -------------------------------------------------------------------------------

 OBJETIVO
 DA ORDEM.....:   ADICIONAR INFORMAÇÕES




 REGISTRO DO
 AUTOR:   112200  FULANO DE TAL



 Data Descr.:   02/01/2014
 Hora Descr.:   11:22:55



 Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
 CONT
VOLTA

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.
Ex.:

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();

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 - http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod):

$exp->expect(2,
              [ qr/\s+SELECIONE(.+)/ => \&normal()],
              [ qr/\s+OBJETIVO(.+)/ => \&obj()],
              [ qr/USUARIO nao autorizado/ => \&cancela()],
              [ timeout => \&cancela() ],
              );

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.


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:

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.

 $exp->expect($timeout,
              [ qr/username: /i, sub { my $self = shift;
                                       $self->send("$username\n");
                                       exp_continue; }],
              [ qr/password: /i, sub { my $self = shift;
                                       $self->send("$password\n");
                                       exp_continue; }],
              $shell_prompt);

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?


Desde já agradeço,
Muito obrigado,
Atte.,
Frederico


2014-04-19 22:35 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:

> Monges mestres! Obrigado pelo apoio e atenção! Estou com acesso restrito
> e, assim que der retorno com detalhes.
>
> 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...
>
> Atte,
> Frederico
>
>
> On Thursday, April 17, 2014, Tiago Peczenyj <tiago.peczenyj at gmail.com>
> wrote:
>
>> 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.
>>
>> sem saber mais detalhes fica impossivel ajudar.
>>
>> 2014-04-17 17:33 GMT-03:00 Daniel de Oliveira Mantovani <
>> daniel.oliveira.mantovani at gmail.com>:
>>
>> Oxi, você pode fazer isso sem usar expected....
>>
>> given(<STDIN>) {
>>
>> }
>>
>> 2014-04-17 17:31 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>> > Oi Daniel,
>> >
>> > Preciso do expect pois vou interagir com o servidor. E analiso o que
>> esse
>> > servidor escreve em uma tela para tomar a decisão do próximo passo...
>> >
>> > A estrutura que você sugeriu é legal mas, acho que só interagindo
>> dentro do
>> > perl.
>> >
>> > Obrigado,
>> >
>> >
>> > 2014-04-17 17:17 GMT-03:00 Daniel de Oliveira Mantovani
>> > <daniel.oliveira.mantovani at gmail.com>:
>> >
>> >> Porque você quer usar expected ? (Seja lá o que esse método que você
>> >> não especificou de onda venha faz).
>> >>
>> >>            given ($text) {
>> >>                obj() when /OBJETIVO/;
>> >>                consulta() when /CONSULTA/;
>> >>            }
>> >>
>> >> 2014-04-17 17:01 GMT-03:00 Tiago Peczenyj <tiago.peczenyj at gmail.com>:
>> >> > nunca usei assim mas baseado neste documento:
>> >> >
>> >> > http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod
>> >> >
>> >> > vc teria que usar o exp_continue no fim de cada subrotina.
>> >> >
>> >> >
>> >> > 2014-04-17 16:58 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>> >> >>
>> >> >> Monges! Socorro!
>> >> >> Sou bem limitado na programação em perl mas estou evoluindo com o
>> >> >> tempo.
>> >> >> Então desculpem pelas minhas dúvidas que para vocês, pode ser muito
>> >> >> simples...
>> >> >>
>> >> >> Bom, estou utilizando expect com perl e analiso alguns outputs de um
>> >> >> servidor, em forma texto, que devo analisar e, dependendo da
>> ocorrência
>> >> >> de
>> >> >> uma string, devo disparar uma determinada sub-rotina para tratativas
>> >> >> específicas.
>> >> >>
>> >> >> Ex.: se aparecer a string CONSULTA, devo disparar a subrotina
>> >> >> consulta()
>> >> >> Se aparecer a string OBJETIVO, devo disparar a subrotina obj() e
>> assim
>> >> >> por
>> >> >> diante.
>> >> >>
>> >> >> O output do servidor é verificado pelo expect e, no momento que devo
>> >> >> tomar
>> >> >> a decisão, a tela do output é apenas uma, com apenas uma das
>> >> >> ocorrências
>> >> >> abaixo.
>> >> >>
>> >> >> Para verificar isso, estruturei o código .pl assim:
>> >> >>
>> >> >> $exp->expect(2,
>> >> >>
>> >> >>               [ qr/SELECIONE/ => \&select()],
>> >> >>
>> >> >>               [ qr/OBJETIVO/ => \&obj()],
>> >> >>
>> >> >>               [ qr/AGUARDE/ => \&sai_6()],
>> >> >>
>> >> >>               [ qr/CONSULTA/ => \&consulta()],
>> >> >>
>> >> >>               [ timeout => \&cancela() ],
>> >> >>
>> >> >>               );
>> >> >>
>> >> >> Ou seja, no meu entendimento limitado, quero que o expect dispare
>> uma
>> >> >> das
>> >> >> subs acima dependendo da string que ele encontrar no output do
>> >> >> servidor.
>> >> >>
>> >> >> Acredito que a estrutura acima, que parece uma matriz (desculpem a
>> >> >> ignorância), vai executar TODAS as subs independente do conteúdo do
>> >> >> output
>> >> >> do servidor.
>> >> >>
>> >> >> O que está acontecendo é que o expect ou o perl só dispara a
>> primeira
>> >> >> sub... select()... independente da string encontrada...
>> >> >>
>> >> >> Sei que a condição para encontrar as strings funcionam pois, fiz um
>> >> >> perl
>> >> >> com expect para cada condição acima e, quando rodo individualmente
>> cada
>> >> >> .pl,
>> >> >> funciona certo... o que estou errando? Como devo fazer o que
>> preciso?
>> >> >>
>> >> >> Por favor, ajude
>>
>>
>>
>>
>> --
>> Tiago B. Peczenyj
>> Linux User #405772
>>
>> http://about.me/peczenyj
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20140422/b5646122/attachment.html>


More information about the SaoPaulo-pm mailing list