seek - reposition file pointer for random-access I/O

- NAME
- SYNOPSIS
- DESCRIPTION

# NAME

seek - reposition file pointer for random-access I/O

# SYNOPSIS

seek FILEHANDLE,POSITION,WHENCE

# DESCRIPTION

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

        for (;;) {
            for ($curpos = tell(FILE); $_ = <FILE>;
                 $curpos = tell(FILE)) {
                # search for some stuff and put it into files
            }
            sleep($for_a_while);
            seek(FILE, $curpos, 0);
        }

seek - reposition file pointer for random-access I/O