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