Márcio! Muito obrigado pelas dicas! Mais uma vez sua ajuda está sendo muito importante! Vou realizar testes antes de incomodar novamente. Obrigado mesmo.
Frederico 2013/3/25 Marcio - Google <[email protected]> > Fala Frederico, > > Vamos lá. Na própria thread o Eden da ótimos exemplos, vou reproduzi-los > aqui e tentar explicar. > > O primeiro que usei foi esse aqui: > > <code> > $exp->send(cmd1$); ##To enviando o comando > > $exp->expect(100, [qr/.{1920}/ => sub { > my($self) = @_; > print $self->match; > } > ] > ); > <code> > > Como você mesmo disse, a tela tem 80x24, ou sejam 1920 caracteres, o que > inclui espaços. > $exp->expect( ##Lê o retorno > O primeiro parâmetro é o timeout > 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. > > > Bom, depois passei para outro mais refinado: > > <code> > $exp->send($cmd1); > $exp->expect(100, [ > qr/resposta cmd1: (.+)/ => sub { > my $self = shift; > > # $resposta vai ter > o que casou com (.+) - Aqui você coloca algo que você esteja esperando > # Digamos que a > informação que você querer seja precedida de <Nome:>, então é isso que você > está esperando > my($resposta) = > $self->match_list; > > # Aqui você guarda > a informação no banco de dados ou qualquer outro processamento > > # enviar segundo > comando, para pegar outra informação, p.e. > $self->send($cmd2); > > exp_continue; # > manda continuar > }, > qr/resposta cmd2: (.+)/ => sub { > my $self = shift; > my($resposta) = > $self->match_list; > > # etc... > > exp_continue; > }, > > # quantas expressões você quiser/precisar > > timeout => sub { die 'o sistema parou de responder' } > ] > ); > <code> > > 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. > > Pra cada vez que você enviar ($exp->send()) você precisa processar o > retorno ($exp->expect()). > O retorno é sempre uma string ou timeout. Você só tem que escolher como > quer processar essa string. > > Se tiver mais dúvidas vai postando que vamos tentando ajudar. > > [...]´s > > Marcio > > Em 25 de março de 2013 16:13, Frederico Melo <[email protected]> escreveu: > > Oi Márcio, tudo bem? >> >> 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. >> >> 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? >> >> Hoje meu código é algo assim: >> >> >> #!/usr/bin/perl >> >> my @s3270 = s3270; >> >> use strict; >> use warnings; >> use Expect; >> >> >> my $exp = Expect->spawn('s3270'); >> >> $exp->log_file('teste.log'); >> >> my $cmd1 = "connect(12.234.123.3:23)\n"; >> $cmd1 .= "wait(InputField)\n"; >> $cmd1 .= "String(username)\n"; >> $cmd1 .= "Enter()\n"; >> $cmd1 .= "wait(InputField)\n"; >> $cmd1 .= "String(password)\n"; >> $cmd1 .= "Enter()\n"; >> $cmd1 .= "wait(InputField)\n"; >> $cmd1 .= "String(APL)\n"; >> $cmd1 .= "Enter()\n"; >> $cmd1 .= "wait(InputField)\n"; >> $cmd1 .= "String(CODAPL)\n"; >> $cmd1 .= "Enter()\n"; >> $cmd1 .= "pf(3)\n"; #TELA INCIAL APL -> VAI PARA CONSULTAS >> $cmd1 .= "wait(InputField)\n"; >> $cmd1 .= "String(14)\n"; >> $cmd1 .= "Enter()\n"; >> $cmd1 .= "wait(InputField)\n"; >> $cmd1 .= "String(01)\n"; >> $cmd1 .= "Enter()\n"; >> $cmd1 .= "String(ordemserv12tt)\n"; >> $cmd1 .= "Enter()\n"; >> $cmd1 .= "Ascii(0,0,24,80)\n"; >> >> 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 >> >> Obrigado novamente! >> Frederico >> >> >> 2013/3/21 Marcio - Google <[email protected]> >> >>> Tiago, nesse caso não. A função "string" é do s3270, e ele entende tudo >>> de forma literal. Também tropecei nisso. >>> >>> Frederico, isso. Se não me engano, para "entrar" o comando é ENTER. >>> Se não funcionar posta novamente que vou ver com fiz. >>> >>> =begin disclaimer >>> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ >>> SaoPaulo-pm mailing list: [email protected] >>> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> >>> =end disclaimer >>> >>> >> >> =begin disclaimer >> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ >> SaoPaulo-pm mailing list: [email protected] >> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> >> =end disclaimer >> >> > > > =begin disclaimer > Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ > SaoPaulo-pm mailing list: [email protected] > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > >
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: [email protected] L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer
