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



 


indietro

[30] Come posso sapere se c'è un carattere in attesa di essere ricevuto da un filehandle?

La prima cosa da fare è ottenere l'estensione Term::ReadKey da CPAN. Come già accennato sopra, ora ha anche un limitato supporto per sistemi non portabili (ossia: sistemi non aperti, chiusi, proprietari, non POSIX, non Unix, etc.).

Si dovrebbe anche controllare nell'elenco delle Frequently Asked Questions sui newsgroup comp.unix.* per cose simili: la risposta è sostanzialmente la stessa. Dipende molto dal sistema operativo. Di seguito si riporta una soluzione che funziona su sistemi BSD:

    sub key_ready {
        my($rin, $nfd);
        vec($rin, fileno(STDIN), 1) = 1;
        return $nfd = select($rin,undef,undef,0);
    }
  
Per sapere quanti caratteri sono in attesa, si puE<ograve> utilizzare anche
la chiamata ioctl FIONREAD. Il programma I<h2ph> che viene distribuito con
il Perl prova a convertire i file include del C in codice Perl, che
puE<ograve> essere utilizzato con il comando C<require>. FIONREAD
E<egrave> definita come funzione nel file I<sys/ioctl.ph>:
    require 'sys/ioctl.ph';
    $dim = pack("L", 0);
    ioctl(FH, FIONREAD(), $dim)    or die "Errore in ioctl: $!\n";
    $dim = unpack("L", $dim);

Se h2ph non è installato o non funziona, si può effettuare un grep manuale sui file include:

    % grep FIONREAD /usr/include/*/*
    /usr/include/asm/ioctls.h:#define FIONREAD      0x541B

Oppure scrivere un piccolo programma C, utilizzando il miglior editor in circolazione:

    % cat > fionread.c
    #include <sys/ioctl.h>
    main() {
        printf("%#08x\n", FIONREAD);
    }
    ^D
    % cc -o fionread fionread.c
    % ./fionread
    0x4004667f

E poi inserire direttamente il valore nel vostro programma, lasciando la portabilità come esercizio per i vostri posteri.

    $FIONREAD = 0x4004667f;         # XXX: dipendente dal sistema operativo
    $dim = pack("L", 0);
    ioctl(FH, $FIONREAD, $dim)     or die "Errore in ioctl: $!\n";
    $dim = unpack("L", $dim);

FIONREAD richiede che il filehandle sia connesso ad un flusso, ossia socket, pipe, e periferiche tty funzionano, ma semplici file no.

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