Perl Programming Documentation
Download Perl
Explore

Manual

- Overview
- Tutorials
- FAQs
- History / Changes
- License

Reference

- Language
- Functions
- Operators
- Special Variables
- Pragmas
- Utilities
- Internals
- Platform Specific

Modules

- A • B • C • D • E
- F • G • H • I • L
- M • N • O • P • S
- T • U • X

Tools

- Preferences

# seek

Perl 5 version 16.0 documentation
Go to top
Show recent pages
Recently read

# seek

Perl functions A-Z | Perl functions by category | The 'perlfunc' manpage

- seek FILEHANDLE,POSITION,WHENCE

  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` 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` 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(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. The `seek` 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:

          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);    }