seek
- seek FILEHANDLE,POSITION,WHENCE
Sets FILEHANDLE's position, just like the
fseek
call ofstdio
. FILEHANDLE may be an expression whose value gives the name of the filehandle. The values for WHENCE areto set the new position in bytes to POSITION;
1
to set it to the current position plus POSITION; and2
to set it to EOF plus POSITION, typically negative. For WHENCE you may use the constantsSEEK_SET
,SEEK_CUR
, andSEEK_END
(start of the file, current position, end of the file) from the Fcntl module. Returns1
on success, false 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
orsyswrite
, don't useseek
, because buffering makes its effect on the file's read-write position unpredictable and non-portable. Usesysseek
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. Theseek
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: