<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=iso-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
++ Daniel<br>
<br>
Esses dias eu vi no Calend&aacute;rio do Perl (desculpem pela falta de
refer&ecirc;ncias) um m&oacute;dulo chamado IPC::Open3::Poll ou algo assim. Faz a
mesma coisa que o IPC::Open3 mas faz leitura ass&iacute;ncrona dos dados (o
que talvez seja muito mais sofisticado que a Patty precisa).<br>
<br>
Aproveitando o enorme gancho, algu&eacute;m a&iacute; j&aacute; deu uma espiada em algo
parecido aos projetos Cometd ou Juggernaut (Java e Ruby,
respectivamente) para Perl? Eu sei que tem o Perlbal, mas ele n&atilde;o foi
desenvolvido para a mesma aplica&ccedil;&atilde;o.<br>
<br>
[]'s<br>
Alceu<br>
<br>
Daniel Ruoso escreveu:
<blockquote cite="mid:1228995607.4094.25.camel@cajueiro" type="cite">
  <pre wrap="">Em Ter, 2008-12-09 &agrave;s 03:35 -0800, Patty Silva escreveu:
  </pre>
  <blockquote type="cite">
    <pre wrap="">Pessoal, 
Tem como eu imprimir na tela "Loading ................." quando
executa o system??
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Ol&aacute;,

Pessoal, eu tenho me mantido meio calado ultimamente, mas vendo esse
thread enorme sem ninguem dar a solu&ccedil;&atilde;o para um problema que, precisamos
reconhecer, n&atilde;o &eacute; "de iniciante", resolvi dar a solu&ccedil;&atilde;o...

A resposta curta &eacute;: "N&atilde;o use system".

A resposta longa &eacute;:


#!/usr/bin/perl
use strict;
use warnings;

use Symbol;
# essa linha define s&iacute;mbolos para os tr&ecirc;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&atilde;o recebe nada pelo stdin
close $wtr;

# usar o IO::Handle &eacute; legal porque ele d&aacute; uma vis&atilde;o OO sobre
# os filehandles, o que facilita algumas coisas...
use IO::Handle;
# por exemplo:
$_-&gt;blocking(0) for ($rdr, $err);
STDOUT-&gt;autoflush(1);

# usar o IO::Select tamb&eacute;m &eacute; legal, porque te permite acompanhar
# filehandles de uma maneira mais esperta
use IO::Select;
my $sel = IO::Select-&gt;new($rdr, $err);

# vamos fazer um loop, e ver se o comando escreveu alguma coisa,
# se ele n&atilde;o escrever em 1 segundo, imprimimos um "."
while (1) {
  my @ready = $sel-&gt;can_read(1000);
  foreach my $io (@ready) {
    my $type = $io == $rdr ? '[STDOUT]' : '[STDERR]';

    # Como estamos fazendo leitura n&atilde;o bloqueante, n&atilde;o devemos
    # usar &lt;$io&gt;...
    if (read $io, my $buf, 1024) {
      print $type, ' ', $buf, $/;
    } else {
      # se read retornar 0 ou undef, &eacute; porque acabou o arquivo ou tem
      # algum erro no filehandle, ent&atilde;o vamos tirar do select.
      $sel-&gt;remove($io);
    }
  }

  # imprime o pontinho...
  print '.' unless @ready;

  # sai se n&atilde;o tem mais nenhum filehandle
  last unless scalar $sel-&gt;handles;
};


# espera o processo sair de verdade;
waitpid $pid, 0;

__END__


e &eacute; isso a&iacute;...
  </pre>
</blockquote>
<br>
</body>
</html>