seek FILEHANDLE,POSITION,WHENCE

設定 FILEHANDLE 的位置,就像 C stdiofseek(3) 呼叫。FILEHANDLE 可以是一個表達式,其值給出檔案代號的名稱。WHENCE 的值為 0,將新位置設定為 POSITION 的位元組1,將其設定為目前位置加上 POSITION;2,將其設定為 EOF 加上 POSITION,通常為負值。對於 WHENCE,您可以使用 Fcntl 模組中的常數 SEEK_SETSEEK_CURSEEK_END(檔案開始、目前位置、檔案結束)。成功時傳回 1,否則為 false。

請注意強調位元組:即使檔案代號已設定為以字元運作(例如使用 :encoding(UTF-8) I/O 層),seektellsysseek 函數系列使用位元組偏移量,而非字元偏移量,因為在 UTF-8 檔案中尋找字元偏移量會非常慢。

如果你想為 sysreadsyswrite 定位檔案,不要使用 seek,因為緩衝會讓它對檔案讀寫位置的影響難以預測且無法移植。請改用 sysseek

由於 ANSI C 的規則和嚴格性,在某些系統上,你必須在讀取和寫入之間切換時執行尋查。除此之外,這可能會呼叫 stdio 的 clearerr(3)。WHENCE 的 1 (SEEK_CUR) 可用於不移動檔案位置

seek($fh, 0, 1);

這也適用於模擬 tail -f 的應用程式。一旦在讀取時遇到 EOF,然後暫停一段時間,你(可能)必須插入一個虛擬的 seek 來重設設定。seek 雖然不會變更位置,但它清除句柄上的檔案結束狀態,以便下一個 readline FILE 讓 Perl 再次嘗試讀取一些東西。(我們希望如此。)

如果這不起作用(某些 I/O 實作特別難搞),你可能需要類似這樣的東西

for (;;) {
    for ($curpos = tell($fh); $_ = readline($fh);
         $curpos = tell($fh)) {
        # search for some stuff and put it into files
    }
    sleep($for_a_while);
    seek($fh, $curpos, 0);
}