[Cascavel-pm] IPC::Open3 comes to the rescue! (Was: Re: Print Loading ao executar system)

Daniel de Oliveira Mantovani daniel.oliveira.mantovani em gmail.com
Quinta Dezembro 11 06:47:32 PST 2008


2008/12/11 Joao Gabriel <jamorreu em gmail.com>

> As vezes 56 linhas bem comentadas valem mais do que 29 e-mails na qual
> 50% ou 60% estão discutindo bobeiras sobre Japh...

Claro, olha o nome do cara 'Daniel' precisa falar mais alguma coisa ?
hahahaha

>
>
>
> --
> João Gabriel C. Laass
>
>
>
> 2008/12/11 Daniel Ruoso <daniel em ruoso.com>:
> > Em Ter, 2008-12-09 às 03:35 -0800, Patty Silva escreveu:
> >> Pessoal,
> >> Tem como eu imprimir na tela "Loading ................." quando
> >> executa o system??
> >
> > Olá,
> >
> > Pessoal, eu tenho me mantido meio calado ultimamente, mas vendo esse
> > thread enorme sem ninguem dar a solução para um problema que, precisamos
> > reconhecer, não é "de iniciante", resolvi dar a solução...
> >
> > A resposta curta é: "Não use system".
> >
> > A resposta longa é:
> >
> >
> > #!/usr/bin/perl
> > use strict;
> > use warnings;
> >
> > use Symbol;
> > # essa linha define símbolos para os três filehandles,
> > # acho que eu vi isso pela primeira vez no PBP
> > my ($wtr, $rdr, $err) = map { gensym } 1..3;
> >
> > use IPC::Open3;
> > my $pid = open3($wtr, $rdr, $err,
> >                'ls', '-la');
> >
> > # considerando que o comando não recebe nada pelo stdin
> > close $wtr;
> >
> > # usar o IO::Handle é legal porque ele dá uma visão OO sobre
> > # os filehandles, o que facilita algumas coisas...
> > use IO::Handle;
> > # por exemplo:
> > $_->blocking(0) for ($rdr, $err);
> > STDOUT->autoflush(1);
> >
> > # usar o IO::Select também é legal, porque te permite acompanhar
> > # filehandles de uma maneira mais esperta
> > use IO::Select;
> > my $sel = IO::Select->new($rdr, $err);
> >
> > # vamos fazer um loop, e ver se o comando escreveu alguma coisa,
> > # se ele não escrever em 1 segundo, imprimimos um "."
> > while (1) {
> >  my @ready = $sel->can_read(1000);
> >  foreach my $io (@ready) {
> >    my $type = $io == $rdr ? '[STDOUT]' : '[STDERR]';
> >
> >    # Como estamos fazendo leitura não bloqueante, não devemos
> >    # usar <$io>...
> >    if (read $io, my $buf, 1024) {
> >      print $type, ' ', $buf, $/;
> >    } else {
> >      # se read retornar 0 ou undef, é porque acabou o arquivo ou tem
> >      # algum erro no filehandle, então vamos tirar do select.
> >      $sel->remove($io);
> >    }
> >  }
> >
> >  # imprime o pontinho...
> >  print '.' unless @ready;
> >
> >  # sai se não tem mais nenhum filehandle
> >  last unless scalar $sel->handles;
> > };
> >
> >
> > # espera o processo sair de verdade;
> > waitpid $pid, 0;
> >
> > __END__
> >
> >
> > e é isso aí...
> >
> > _______________________________________________
> > Cascavel-pm mailing list
> > Cascavel-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/cascavel-pm
> >
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>



-- 
Procuro emprego C.V:
http://danielmantovani.awardspace.com/

print
"\x54\x68\x65\x20\x53\x69\x6c\x65\x6e\x74\x20\x47\x75\x61\x72\x64\x69\x61\x6e",$/
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20081211/13ba8f28/attachment.html>


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