Sets FILEHANDLE's position, just like the fseek(3) call of C 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, false
otherwise.
Note the emphasis on bytes: even if the filehandle has been set to operate
on characters (for example using the :encoding(UTF-8)
 I/O layer), the
seek,
tell, and
sysseek
family of functions use byte offsets, not character offsets,
because seeking to a character offset would be very slow in a UTF-8 file.
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($fh, 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 readline 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: