設定 FILEHANDLE 的位置,就像 C stdio
的 fseek(3) 呼叫。FILEHANDLE 可以是一個表達式,其值給出檔案代號的名稱。WHENCE 的值為 0
,將新位置設定為 POSITION 的位元組;1
,將其設定為目前位置加上 POSITION;2
,將其設定為 EOF 加上 POSITION,通常為負值。對於 WHENCE,您可以使用 Fcntl 模組中的常數 SEEK_SET
、SEEK_CUR
和 SEEK_END
(檔案開始、目前位置、檔案結束)。成功時傳回 1
,否則為 false。
請注意強調位元組:即使檔案代號已設定為以字元運作(例如使用 :encoding(UTF-8)
I/O 層),seek
、tell
和 sysseek
函數系列使用位元組偏移量,而非字元偏移量,因為在 UTF-8 檔案中尋找字元偏移量會非常慢。
如果你想為 sysread
或 syswrite
定位檔案,不要使用 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);
}