Muito bom. Mais uma ferramenta no meu canivete suíço!!! Em Ter, 2013-03-26 às 13:20 -0300, Frederico Melo escreveu: > 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 <marci...@gmail.com> > 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 > <fdmm...@gmail.com> 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 <marci...@gmail.com> > > 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: SaoPaulo-pm@pm.org > 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: SaoPaulo-pm@pm.org > 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: SaoPaulo-pm@pm.org > 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: SaoPaulo-pm@pm.org > 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: SaoPaulo-pm@pm.org L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer