Thank you. The program works and it prints the lines from the file, but it
also waits for more seconds before printing a new group of last added lines.
I think it is a problem due to the program that makes the link between the 2
computers. I don't remember its name, but it is not Samba.
Thanks.
Octavian
----- Original Message -----
From: "Andrew Curry" <[EMAIL PROTECTED]>
To: "Octavian Rasnita" <[EMAIL PROTECTED]>; "Jeff Pang"
<[EMAIL PROTECTED]>; "beginners perl" <beginners@perl.org>
Sent: Tuesday, July 24, 2007 1:12 PM
Subject: RE: reading from a file
If you want an over complex solution you could try using
use IPC::Open3;
use IO::Select;
use IO::Handle;
i.e.
#!/usr/local/bin/perl -w
use Data::Dumper;
use File::Copy;
use IPC::Open3;
use IO::Select;
use IO::Handle;
use strict;
use vars qw(
$line $select
$read $write $error
);
( $select, $read, $error ) =
process_command('/usr/bin/tail -f tmp.dat');
process_tail($select);
close_handles( $read, $error );
sub process_command {
my ($command) = @_;
my ( $pid, $readbuff, $timeout, $s );
$timeout = 10;
$read = new IO::Handle;
$error = new IO::Handle;
$pid = open3( $write, $read, $error, $command );
#
# create selects
#
$s = IO::Select->new();
$s->add($read);
$s->add($error);
return ( $s, $read, $error ); }
sub process_tail {
my ($select) = shift;
my ( @ready, $handle, $timeout, $readbuff, $flag, $tapeloc, $newnum );
$flag = 0;
#
# get write handle
#
while ( $flag == 0 ) {
@ready = $select->can_read($timeout);
foreach $handle (@ready) {
sysread( $handle, $readbuff, 256 ); # 256 is the number of
chars
to read.
if ( length($readbuff) == 0 ) {
$flag = 1;
}
}
#
# do something here
#
print "$readbuff\n";
}
sleep(1);
}
sub close_handles {
my ( $r, $e ) = @_;
$r->close();
$e->close();
}
Its not been tested so not sure if it will do what you require.
-----Original Message-----
From: Octavian Rasnita [mailto:[EMAIL PROTECTED]
Sent: 24 July 2007 10:45
To: Jeff Pang; beginners perl
Subject: Re: reading from a file
From: "Jeff Pang" <[EMAIL PROTECTED]>
--- Octavian Rasnita <[EMAIL PROTECTED]> wrote:
Hi,
I am trying to read from a log file which increase continuously
almost every second.
You may try the Unix 'tail' command and pipe the result to your Perl
program.Like:
tail -f access_log|perl -e
'while(<>){handle_routine()}'
handle_routine() is your routine for handling logfile lines.
I can do this, but in that case I don't know how to be sure that I don't
skip any line of the file.
The condition is to not skip any line and to not get the same line twice.
I tested the tail command in the command line using:
tail -n 1 /path/to/file
because I wanted to get only the last line of the file.
If I use that command for more times, sometimes the same last line is
printed for more times, but sometimes the tail command doesn't print
anything.
I don't know if the result of tail can be trusted...
Thank you.
Octavian
--
To unsubscribe, e-mail: [EMAIL PROTECTED] For additional
commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/
This e-mail is from the PA Group. For more information, see
www.thepagroup.com.
This e-mail may contain confidential information. Only the addressee is
permitted to read, copy, distribute or otherwise use this email or any
attachments. If you have received it in error, please contact the sender
immediately. Any opinion expressed in this e-mail is personal to the
sender
and may not reflect the opinion of the PA Group.
Any e-mail reply to this address may be subject to interception or
monitoring for operational reasons or for lawful business practices.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/