Sets FILEHANDLE's position, just like the fseek
call of stdio
.
FILEHANDLE may be an expression whose value gives the name of the
filehandle. The values for WHENCE are 0
to set the new position
in bytes to POSITION, 1
to set it to the current position plus
POSITION, and 2
to set it to EOF plus POSITION (typically
negative). For WHENCE you may use the constants SEEK_SET
,
SEEK_CUR
, and SEEK_END
(start of the file, current position, end
of the file) from the Fcntl module. Returns 1
on success, 0
otherwise.
Note the in bytes: even if the filehandle has been set to
operate on characters (for example by using the :encoding(utf8)
open
layer), tell() will return byte offsets, not character offsets
(because implementing that would render seek() and tell() rather slow).
If you want to position the file for sysread
or syswrite
, don't use
seek
, because buffering makes its effect on the file's read-write position
unpredictable and non-portable. Use sysseek
instead.
Due to the rules and rigors of ANSI C, on some systems you have to do a
seek whenever you switch between reading and writing. Amongst other
things, this may have the effect of calling stdio's clearerr(3).
A WHENCE of 1
(SEEK_CUR
) is useful for not moving the file position:
- seek(TEST,0,1);
This is also useful for applications emulating tail -f
. Once you hit
EOF on your read and then sleep for a while, you (probably) have to stick in a
dummy seek() to reset things. The seek
doesn't change the position,
but it does clear the end-of-file condition on the handle, so that the
next <FILE>
makes Perl try again to read something. (We hope.)
If that doesn't work (some I/O implementations are particularly cantankerous), you might need something like this: