indietro

  • seek FILEHANDLE,POSIZIONE,DA_DOVE

    Imposta la posizione nel FILEHANDLE, proprio come la funzione fseek della libreria stdio. FILEHANDLE può essere un'espressione il cui valore restituisce il nome del filehandle. I valori per DA_DOVE sono: 0 per impostare in bytes la nuova posizione a POSIZIONE, 1 per impostarla alla posizione corrente più POSIZIONE, e 2 per impostarla a EOF (fine del file) più POSIZIONE (generalmente negativa). Per DA_DOVE si possono utilizzare le costanti SEEK_SET, SEEK_CUR e SEEK_END (inizio del file, posizione corrente, fine del file) definite nel modulo Fcntl. Restituisce 1 se l'operazione è stata eseguita correttamente, 0 altrimenti.

    Da notare l'espressione in bytes: anche se il file è stato impostato per operare su caratteri (ad esempio utilizzando lo strato aperto :utf8), tell() restituisce uno scostamento in bytes, non in numero di caratteri (poiché un'implementazione in tal senso renderebbe seek() e tell() piuttosto lente).

    Per posizionarsi nel file per eseguire sysread o syswrite, non utilizzate seek, l'utilizzo del buffering rende il suo effetto sul file imprevedibile e non portabile. Utilizzate invece sysseek.

    A causa delle regole ferree dell'ANSI C, su alcuni sistemi è necessario un seek ogni volta che si passa da operazioni di lettura a operazioni di scrittura. Fra le altre cose, questo potrebbe avere l'effetto di chiamare la funzione stdio clearerr(3). Un DA_DOVE di 1 (SEEK_CUR) può essere utile per non muovere la posizione nel file:

        seek(TEST,0,1);

    Questo può anche essere utile per applicazioni che simulino il comportamento di tail -f. Una volta raggiunto EOF in lettura del file, potrebbe essere necessario un seek() per rimettere le cose a posto. Il seek non cambia la posizione corrente, ma fa in modo che la condizione di fine del file venga reimpostata, in modo che al prossimo <FILE> Perl tenti nuovamente di leggere qualcosa. O almeno così dovrebbe essere.

    Se questo non dovesse funzionare (alcune implementazioni dell'IO sono particolarmente bizzose), ci potrebbe essere bisogno di qualcosa di simile a:

        for (;;) {
            for ($poscorrente = tell(FILE); $_ = <FILE>;
                 $poscorrente = tell(FILE)) {
                # cerca qualcosa e scrivilo in qualche file
            }
            sleep($un_poco);
            seek(FILE, $poscorrente, 0);
        }