Frederico, isso é uma missão para o Mestre Eden ... :-) Abs, Marcio.
Em 10 de abril de 2013 11:40, Frederico Melo <fdmm...@gmail.com> escreveu: > > Fala Márcio! > Consegui avançar com a ajuda de vocês! Mas ainda preciso de algumas dicas. > Realmente não tenho os conhecimentos necessários no perl e no expect para > avançar ainda mais. Fiquei preso em uma situação onde preciso capturar mais > de um dado na tela que a função ascii do s3270 retorna pelo expect. Li e > reli suas dicas e as do Eden mas, não consigo ir além... Acredito que o > problema aqui é no meu entendimento das funções, das subs e nas rotinas > dentro do expect. > > O ascii retorna a seguinte string: > > data: > data: APLNC000 *** SUBSISTEMA APL *** > MMM2D000 > data: 09/04/2013 CONSULTA DE LOCALIDADES > 15:46:09 > data: > data: SIGLA.........: XYZ *NUMERO DO > COD.: 0DD* > data: > data: *LOCALIDADE....: XISYPSZE* > data: > data: MUNICIPIO.....: XISYPS > data: > data: > data: > data: CONCES: CONCESSOR > data: > data: CODIGO DA TOT.: DD > data: > data: > data: > data: > data: > data: ESTA LOCALIDADE E' ABERTA > data: > data: > data: > > Na tela acima, gostaria de pegar os dados LOCALIDADE e guardar em $loc e > NUMERO DO COD, guardar em $cod > Meu código, está da seguinte maneira: > > <code> > > $exp->send($cmd1); > $exp->expect(5, [ > > qr/data:\s+*LOCALIDADE*(.+)/ => sub { > my $self = shift; > my($rr1) = $self->match; > my $rp=""; > $loc=$rr1; > $loc = substr($rr1,6,55); > $loc =~ s/\s//g; > print "\n\n$loc\n\n"; > > exp_continue; # manda continuar > }, > qr/data:\s+(.+)*NUMERO*\s+(.+)/ => sub { > my $self = shift; > my($cod) = $self->match; > print "\ncod=xxx$codxxx\n"; > > exp_continue; > }, > > # quantas expressões você quiser/precisar > > timeout => sub { die 'o sistema parou de responder' } > ] > ); > > <code> > > O primeiro print funciona ok e tenho o retorno correto de $loc mas, o > segundo print para $cod não funciona e não traz nada. Posso fazer as subs > acima? A variável $self é especial do perl? O shift que usei na primeira > regex vai afetar a segunda chamada para regex? Realmente me falta > conhecimento para entender. Por favor, me ajude. Obrigado novamente pela > sua atenção. > > Abcs, > 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 > > -- [...]'s Marcio
=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