Perl 5 version 26.3 documentation

seek

  • seek FILEHANDLE,POSITION,WHENCE

    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 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:

    1. 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:

    1. for (;;) {
    2. for ($curpos = tell($fh); $_ = readline($fh);
    3. $curpos = tell($fh)) {
    4. # search for some stuff and put it into files
    5. }
    6. sleep($for_a_while);
    7. seek($fh, $curpos, 0);
    8. }