[Cascavel-pm] Controle de processo em perl

Luis Motta Campos luismottacampos em yahoo.co.uk
Quarta Maio 14 09:51:19 PDT 2008


kleber wrote:
> Ok Mota , Agradeço sua atenção.

"Motta", por favor. Mas não precisa ser tão formal. O pessoal aqui me
chama "champs" ou "Luis".

> Vou tentar descrever meu problema.

OK, boa tentativa. :) Isso vai precisar de mais um ou dois emails, mas
eu tenho certeza de que, trabalhando juntos, a gente pode resolver depressa.

O que eu entendi do seu problema até agora:

1. Você está usando Perl como uma "linguagem de cola", para conectar um
programa na "baixa plataforma" com um sistema cobol (na "alta plataforma").

2. O sistema cobol conhece credenciais de usuários, permissões de acesso
a sistemas e autorizações de acesso para cada um destes sistemas. Você
não nomeou nenhum dos sistemas, mas é fácil presumir que você está
oferecendo uma "interface web" para os sistemas que existem no Cobol.

3. A forma como o sistema cobol funciona requer que você gere um arquivo
e o passe como parametro na chamada de system() que executa para chamar
o Cobol; O sistema Perl precisa gerar arquivos diferentes para cada
invocação do sistema, ou o cobol "troca" as permissões de acesso dos
usuários que você está consultando na "alta plataforma".

4. Depois que o Cobol termina de executar, ele gera um arquivo HTML
sobre o "status do processamento".

Por favor me confirme que isso que eu entendi é o que você falou.

Agora, as minhas perguntas e observações:

A. Eu gostaria de saber se o programa cobol pode ser invocado para ler
da entrada padrão (STDIN) e escrever na saída padrão (STDOUT). Isso é
possível? Assim, a gente pode fazer o Perl não precisar gerar arquivos,
mais.

B. Eu gostaria que você me explicasse qual é o conteúdo do HTML gerado
pelo Cobol, e o que você faz com ele - não precisa detalhe, eu quero
apenas entender o mecanismo e ter uma idéia sobre os dados que você
espera de volta.

C. Você deve saber (por que eu já estou careca de dizer) que Javascript
não é feito para validar dados de sistemas sérios (assim como todas as
outras tecnologias que rodam no cliente): um cliente "esperto" pode
"burlar" o Javascript e você vai receber lixo.

Javascript pode ajudar a entrada de dados (mudando campos para o
usuário, ou verificando coisa simples, como se algum campo obrigatório
está vazio), mas nunca deve ser usado como ferramenta de validação de
dados de entrada. Eu recomendo que você escreva a tua validação de dados
de entrada em Perl, usando o módulo Params::Validate:

http://search.cpan.org/~drolsky/Params-Validate-0.91/lib/Params/Validate.pm

D. Para resolver o teu problema de criar arquivos com nomes iguais ou
parecidos, eu recomendo que você use o File::Temp:

http://search.cpan.org/~tjenness/File-Temp-0.20/Temp.pm

E escreva alguma coisa assim:

#!perl
use strict;
use warnings;
use File::Temp ();
use IO::Handle;

sub grava_arquivo_entrada_cobol {
   my @dados = @_;
   my $tmp = File::Temp->new;
   $tmp->print( q{ Imprima seus dados com } );
   $tmp->print( q{ $tmp->print() até ter tudo } );
   $tmp->print( q{ o que você precisa no arquivo temporário. } );
   $tmp->flush; # garante que os dados estão gravados no arquivo
   return $tmp;
}

# Para obter o nome do arquivo:

my @dados = valida_dados( coleta_dados_do_formulario() );
my $arquivo = grava_arquivo_entrada_cobol( @dados );
my $nome_arquivo = $arquivo->filename;
# ...

E. Eu observei que você está usando o pior de todos os métodos de chamar
um programa externo, o system(). E você não deve estar verificando erros
de maneira apropriada - system é complexo, e é sempre muito difícil
verificar se uma chamada aconteceu com sucesso ou falha.

Eu posso sugerir algumas alternativas, e dar o método correto "de
bandeja" para você chamar system() sem susto:

E.1. (Alternativa) open() para chamar processos:

Se o teu processo externo aceita receber dados via entrada padrão
(STDIN) e tem uma opção para garantir que os dados que ele produzir (no
seu caso, o HTML) vão ser enviados para a saída padrão (STDOUT), então
você pode usar open() para abrir processos, com a vantagem de que o
open() vai tratar da comunicação. Isso quer dizer que você não precisa
mais criar arquivos, nem usar o esqueminha de arquivos temporários que
eu te indiquei em (D).

Isso depende do que você me responder em (A), e (B). Assim, eu vou
deixar os detalhes para mais tarde.

E.2. Chamada de System com verificação de erros, conforme descrita na
documentação da função system() (o comando "perldoc -f system",
executado a partir do seu shell te traz a documentação nos sistemas
operacionais que eu uso).

   sub chama_cobol {
     my ( $arquivo_entrada, $arquivo_saída ) = @_;
     # mude este array para ficar com a cara
     # e o jeito do comando que você quer.
     my @comando = 'cobol', 'programa.cobol',
         $arquivo_entrada, $arquivo_$saida;

     # executa o comando cobol
     system( @comando ) == 0
         or die qq{Merda na execução do comando "@comando": $?};

     # Confere se tudo correu bem:
     if( $? == -1 ){
         die qq{Falha na execução: $!.};
     }elsif( $? & 127 ) {
         die sprintf q{Processo filho morreu com sinal %d, %s coredump.},
             ($? & 127),  ($? & 128) ? 'com' : 'sem';
     }else{
         die sprintf q{Processo saiu com resultado %d.}, $? >> 8;
     }

     return 1; # sucesso!
   }

> Espero ter descrito com mais clareza minha necessidade.

Como você pode ver, valeu à pena escrever ;)

> Nota - Minha capacidade de programação em perl é modesta. Estou me
orientando pelo livro PERL COMO PROGRAMAR - DEITEL.

Você escolheu o pior de todos os livros, do pior de todos os autores. O
pessoal da lista vai te indicar outros livros, em portugues. O que eu
posso te recomendar é que você persista em aprender mais, mas estude
inglês, e recorra à (farta, bem-feita) documentação existente nesta língua.

Ainda não está completo, mas eu estou quase enxergando a solução
perfeita do seu problema aqui ;) espero que isso te ajude.

Ah! Você me deve uma cerveja ;^) - por favor aparece no encontro social
dos São Paulo Perl Mongers, neste sábado, se você estiver nas
proximidades. Eu vou gostar de te encontrar em pessoa.

Putamplexos!
-- 
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}



Mais detalhes sobre a lista de discussão Cascavel-pm