#!/usr/bin/perl use strict; use warnings; use POSIX ":sys_wait_h"; use IO::Handle; my $timeout=5; my $output=''; my $bsize=63; # Interface: # zuerst die Gesammtzahl der Punkte die kommen werden als Zahl beendet mit "\n" # danach die Punkte. # Beispiel: my $cmd=q!perl -e ' $|=1; $x=111; print "$x\n"; for(0..$x) { print "."; select(undef,undef,undef,rand(1)); } '!; { my $pid=open(my $ph, '-|', $cmd) or die("ERROR START $cmd ($!)\n"); # die Anzhal der kommenden Punkte einlesen my $size=<$ph>; chomp($size); # handle ist nicht blockierend! $ph->blocking(0); my $cnt=0; # Ausgabe nicht puffern local $|=1; # wenn der prozes noch läuft # und noch nicht alle Punkte gesendet wurden. while(waitpid($pid, WNOHANG) == 0 && $cnt<$size) { # versuche zu lesen # ist nicht blockierend! my $dots=<$ph>; # etwas gelesen? if($dots) { # die Punkte zählen my $c=($dots=~y/././); # zähler erhöhen $cnt+=$c; } # prozent errechnen my $percent=(100/$size)*$cnt; # balken erzeugen my $line=substr(('='x(($bsize/$size)*$cnt))."|".(' 'x$bsize),0,$bsize); # aktuelle Zeit (hacky) my $time=substr(localtime(),11,8); # alles ausgeben printf "\r% 3u%% [%s] %s", $percent, $line, $time; # bischen warten select(undef,undef,undef,0.2) } close($ph); print "\n"; }