-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[1] Come faccio a terminare le operazioni di I/O in corso o a privare del buffer un filehandle di output? Perché devo fare questo? flush buffer unbuffer autoflush

Il Perl non supporta esattamente l'output privo di buffer (salvo nel caso in cui possiate eseguire syswrite(OUT, $char, 1)) benché supporti il "command buffering" [utilizzo del buffer a comando, NdT], nel quale una scrittura fisica viene eseguita dopo ogni comando di output.

La libreria standard di I/O del C (stdio) di solito utilizza il buffer per i caratteri inviati alle periferiche cosicché non ci sia una chiamata di sistema per ogni byte. In molte implementazioni di stdio, il tipo di output con buffer e la dimensione del buffer variano a seconda del tipo di periferica. Le funzioni Perl print() e write() di solito hanno l'output con buffer, mentre syswrite() evita del tutto l'uso del buffer.

Se volete che il vostro output venga immediatamente inviato quando eseguite print() o write() (per esempio, per alcuni protocolli di rete), dovete settare il flag di terminazione automatica delle operazioni di I/O in corso dell'handle. Questo flag è costituito dalla variabile Perl $| e quando viene impostata ad un valore vero, il Perl svuoterà il buffer dell'handle dopo ogni print() o write(). Impostare $| influenza l'uso del buffer solo per il filehandle di default attualmente selezionato. Scegliete questo handle con la chiamata select() ad un argomento (vedete perlvar/$ e perlfunc/select).

Usate select() per scegliere l'handle desiderato, poi impostate le sue variabili per filehandle.

    $vecchio_fh = select(OUTPUT_HANDLE);
    $| = 1;
    select($vecchio_fh);

Alcune espressioni idiomatiche possono gestirlo in una singola istruzione:

    select((select(OUTPUT_HANDLE), $| = 1)[0]);
    $| = 1, select $_ for select OUTPUT_HANDLE;

Alcuni moduli offrono un accesso orientato agli oggetti agli handle e alle loro variabili, sebbene possa essere eccessivo se questa è l'unica cosa per cui li usate. Potete usare IO::Handle:

    use IO::Handle;
    open(DEV, ">/dev/printer");   # ma E<egrave> questa?
    DEV->autoflush(1);

oppure IO::Socket:

    use IO::Socket;          # questa E<egrave> tipo una pipe?
    my $sock = IO::Socket::INET->new( 'www.esempio.com:80' );
    $sock->autoflush();

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google