reading file round and round

C

cerr

Hi There,

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,
 
C

cerr

Hi There,

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?

Do I actually need to close() and reopen my file or is there another
way to achieve this?
 
C

C.DeRykus

Do I actually need to close() and reopen my file or is there another
way to achieve this?

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.
 
J

jl_post

Hi There,

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?


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
 
J

Jürgen Exner

cerr said:
Hi There,

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?

perldoc -f seek

jue
 
J

Jürgen Exner

C.DeRykus said:
LOOP:
{
foreach $line (<$handle>)
{
...
}
seek($handle, 0, 0) or die ...
redo LOOP;
}

Why not

while(1){
foreach $line (<$handle>){
{ ...
}
seek(...) or die ...
}

instead of that ugly label?

jue
 
P

Peter J. Holzer

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.

Are they really?

hp
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top