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
upon 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 file for sysread
or syswrite
, don't use
seek
--buffering makes its effect on the file's system 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 might have to stick in a
seek() to reset things. The seek
doesn't change the current 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 IO implementations are particularly cantankerous), then you may need something more like this: