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