使用 lseek(2) 設定 FILEHANDLE 的系統位置(以位元組為單位)。FILEHANDLE 可以是一個表達式,其值提供檔案代號的名稱。WHENCE 的值為 0
,將新位置設定為 POSITION;1
,將其設定為目前位置加上 POSITION;2
,將其設定為 EOF 加上 POSITION,通常為負值。
請注意強調位元組:即使檔案代號已設定為以字元操作(例如使用 :encoding(UTF-8)
I/O 層),seek
、tell
和 sysseek
函式系列使用位元組偏移,而不是字元偏移,因為在 UTF-8 檔案中尋找字元偏移會非常慢。
sysseek
繞過正常的緩衝 I/O,因此將其與 sysread
以外的讀取(例如 readline
或 read
)、print
、write
、seek
、tell
或 eof
)混合使用可能會造成混淆。
對於 WHENCE,您也可以使用 Fcntl 模組中的常數 SEEK_SET
、SEEK_CUR
和 SEEK_END
(檔案開頭、目前位置、檔案結尾)。使用常數比依賴 0、1 和 2 更具可移植性。例如,要定義一個「systell」函式
use Fcntl 'SEEK_CUR';
sub systell { sysseek($_[0], 0, SEEK_CUR) }
傳回新位置,或在失敗時傳回未定義值。零的位置會傳回字串 "0 but true"
;因此 sysseek
在成功時傳回 true,在失敗時傳回 false,但您仍然可以輕鬆地判斷新位置。