[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