使用 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,但你仍然可以轻松地确定新位置。