Newsgroup: it.comp.lang.perl
Titolo: print "\r" : comportamento strano...

  Ho un piccolo dubbio. Considerate queste righe:
  for( my $cnt = 1; $cnt <= 10; $cnt++ ) {
     print "prova ", $cnt, "\r";
     for( my $x = 0; $x <= 100000; $x++ ) {}
     # piccola pausa fra un print e l'altro per verificarne l'effetto
  }
  Beh... sotto Linux non stampa nulla! Mentre se scrivo
  print STDERR "prova ", $cnt, "\r";
  allora  ottengo l'effetto  voluto... La  cosa "curiosa"  (si fa  per
dire)  e` che  invece sotto  Windows (ActivePerl)  funziona anche  nel
primo modo.
  Cos'e` che mi sfugge?
  (azzardo  un'ipotesi: poiche'  print  puo`  essere rediretto,  viene
normalmente  bufferizzato  e  ne  viene scaricato  l'output  al  primo
newline,  mentre  il print  STDERR,  per  ovvi motivi,  'deve'  essere
visualizzato  subito...  pero`  questo  non spiega  la  differenza  di
comportamento nelle due piattaforme...)
-- 
Power down.

DisKre Panza <demo...@demokrito.org.asm> wrote in 
news:slrnapc27r.7...@demokrito.org.asm:

Quasi: per quanto ne so, la bufferizzazione non avviene a livello di 
perl, ma nella libreria di I/O di sistema, per cui e' il sistema che
decide quando fare una flush. Per ovviare a questo, puoi:
1)
mettere "use IO::Handle" da qualche parte e poi usare
STDOUT->autoflush( 1 ); ( vedi documentazione su IO::Handle )
2)
impostare $| a qualcosa != 0 ( vedi perlvar e perldoc -f select )
$oldfh = select(HANDLE); $| = 1; select($oldfh);
Ciao
Mattia

 $oldfh = select(HANDLE); $| = 1; select($oldfh);
  Questa non ci provo nemmeno a capirla. Semmai fra qualche anno... ;)
  Tuttimodi, ti ringrazio.
  Pero` pensavo che, in fondo in  fine, a livello "pratico" non e` del
tutto sbagliato il comportamento sotto  Linux. A ben pensarci, il "\r"
lo  puoi utilizzare  praticamente solo  a schermo  (per aggiornare  un
feedback, appunto) o su stampante (il buon vecchio trucco per ottenere
l'"enfatizzato"). Altri utilizzi non mi vengono in mente. Quindi Linux
dimostra di avere piu` "buon senso"... o no? ;)
-- 
Power down.

   Questa non ci provo nemmeno a capirla. Semmai fra qualche anno... ;)
... che strano... questa è la più semplice :-)...
$| è la variabile speciale relativa all'autoflush... se usi il modulo "English"
(use English;) potresti pure chiamarla $OUTPUT_AUTOFLUSH.
========= perldoc perlvar ==========
 $|      If set to nonzero, forces a flush right away and after every
         write or print on the currently selected output channel. Default
         is 0 (regardless of whether the channel is really buffered by
         the system or not; "$|" tells you only whether you've asked Perl
         explicitly to flush after each write). STDOUT will typically be
         line buffered if output is to the terminal and block buffered
         otherwise. Setting this variable is useful primarily when you
         are outputting to a pipe or socket, such as when you are running
         a Perl program under rsh and want to see the output as it's
         happening. This has no effect on input buffering. See the getc
         entry in the perlfunc manpage for that. (Mnemonic: when you want
         your pipes to be piping hot.)
===============================
ciao
dd

dimostra di avere piu` "buon senso"... o no? ;)
Secondo me no, ma in fondo e' solo la mia opinione...
Ciao
Mattia

========= perldoc perlvar ==========
  Altro mio limite e` che,  se tutta la documentazione 'perldoc' fosse
in italiano, me la sarei gia`  stampata e letta e riletta e riletta...
Per ora mi  limito a stampare - e  a "capire" - solo quel  poco che mi
serve al momento. Un passo alla volta, ma ben "saldo"...
  Cmq,  l'oggetto del  contendere  era  come mai  uno  script perl  si
comporta  in maniera  diversa a  seconda della  piattaforma utilizzata
(Linux - Windows NT 4.0) in una funzione 'basilare' come 'print'...
  Ti ringrazio.
-- 
Power down.

 Secondo me no, ma in fondo e' solo la mia opinione...
  Era poi questo  quel che mi interessava di  piu`. Perche' l'inghippo
e`  nato  scrivendo  codice  che  su  di  una  piattaforma  funzionava
perfettamente, mentre sull'altra  no. E allora cercavo  di capire come
non ricadere nell'errore di scrivere codice non portabile.
