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);
}