I read out the content from a file like:
foreach $line (<$handle>) {
print $line;
sleep(1);
}
whixh works well so far. But what I would like is, if the loop gets to
eof, it should start over on top again. How can i reset the reading
pointer back to the beginning of the file?
Thanks,
--
roN
Do I actually need to close() and reopen my file or is there another
way to achieve this?
>
> Thanks,
> --
> roN
Posting followups to yourself will not make people more likely to
respond.
You want perldoc -f seek, and the :seek exports from Fcntl.
Ben
LOOP:
{
foreach $line (<$handle>)
{
...
}
seek($handle, 0, 0) or die ...
redo LOOP;
}
But if you're actually just trying to emulate a
tail -f, look at the seek doc (perldoc -f seek)
for details on the WHENCE argument. You could
pick up newly appended lines and avoid reading through the entire file
with each loop.
--
Charles DeRykus
Don't do that (I know perldoc -q tail recommends it, but it ought to be
updated). Use the constants from the Fcntl module, they're more
portable.
Ben
If an infinite loop is what you want, you can always use the
Tie::File module (which you may already have in your installation of
Perl) and just increment the index variable, making sure to "mod" it
by the number of lines.
Here's an example:
#!/usr/bin/perl
use strict;
use warnings;
my $fileName = 'file.txt';
use Tie::File;
tie my @lines, 'Tie::File', $fileName
or die "Could not open file '$fileName': $!\n";
die "No lines found in '$fileName'.\n" unless @lines;
my $lineNum = 0;
while (1)
{
print $lines[$lineNum], "\n";
sleep(1);
}
continue
{
# Increment $lineNum, but make sure it doesn't exceed $#lines:
$lineNum++;
$lineNum %= @lines;
}
__END__
This solution may seem overkill for your example, but if you have a
more complex task where you'd rather traverse arrays instead of
manipulating file handles, Tie::File is quite nice.
Cheers,
-- Jean-Luc
perldoc -f seek
jue
Why not
while(1){
foreach $line (<$handle>){
{ ...
}
seek(...) or die ...
}
instead of that ugly label?
jue
Are they really?
hp
Honestly? I've no idea :). In principle they might be, though, and
anyway a proper constant is always nicer than random magic numbers.
Ben