Reading terminal input while program is running
minixman
created: 2006-02-01 04:58:09
All

Is there a way to send a control like symbol to a running
program, so if i run the following

$ perl current_users.pl
#################################
Current users info
#################################

So the program has started, but i want to be able to pass
something like "display" by typing it in, and if it gets
that passed into the terminal it knows it has to print
something out.

But i would not want to use something like

my $INFO = ; as that would make the program wait for
input, i want it to carry on processing, and then allow a user to pass input.
Re: Reading terminal input while program is running
created: 2006-02-01 05:09:37

Take a look at the non-blocked reading mode in [mod://Term::ReadKey]. For example:

#!/usr/bin/perl

use warnings;
use strict;
use Term::ReadKey;

while(1) {
    #do some stuff
    print "Did something\n";
    sleep 5;
    if (my $line= ReadLine -1) {
        print "Got this command: $line";
    }
}


There are ten types of people: those that understand binary and those that don't.
Re^2: Reading terminal input while program is running
created: 2006-02-01 05:26:56
When i run it i am not getting anything back from the request

$ perl current_users.pl `pwd`
##############################################
        GFMIS Exlink User Activity

   Start: 01/02/2006 10:24 : Host = EU1
##############################################
2006-01-25 15:38:24,953: Trader (DBL99911) = Connected
DISPLAY
2006-01-25 15:38:24,953: Trader (DBL99911) = Connected
Hey i got the following signal INT
Somebody sent me a SIGINT at current_users.pl line 110.
Re^3: Reading terminal input while program is running
created: 2006-02-01 05:37:05

Sorry, my magic crystal ball is still out for repair (damn Grima!). You'll need to post code for anyone to figure out what's wrong in your script. Please make an effort to cut it down to the part that's necessary (i.e. the bit that's not doing what you think it ought to) before doing so though.


There are ten types of people: those that understand binary and those that don't.
Re^4: Reading terminal input while program is running
created: 2006-02-01 05:59:07
Here is the part which reads a log file which process all the information.
      $file=File::Tail->new(name=>$name, maxinterval=>1, adjustafter=>1);
      while (defined($line=$file->read)) {
         my($logindate,$loginuser,$logoutdate,$logoutuser,$count);
         #if($line =~ /validateLogin\((.*)\)/){ $v = $1;}
         if($line =~ /INFO\s\s(\d+)(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+),(\d+)\s\[(.*)\]\s\((.*)\) - validateLogin\((.*)\)/){
          $logindate = "$1$2-$3-$4 $5:$6:$7,$8";
          $loginuser = "$11";
          if(($logging)&&($debug)){&writelog(1,"DEBUG: Tail Event Login found user date string = $logindate user = $loginuser");}
         }
}
So i guess somewhere whilst it is processing the file i would want to be able to lookout for user intput on the terminal
Re^5: Reading terminal input while program is running
created: 2006-02-01 06:55:41

Your while loop only executes whenever File::Tail finds a new line appended to the file you're watching. So you could do this (reformatted a bit for readability):

my $file=File::Tail->new( name        => $name,
                          maxinterval => 1,
                          adjustafter => 1);

while (defined(my $line=$file->read)) {
    my($logindate,$loginuser,$logoutdate,$logoutuser,$count);
    if($line =~ /INFO\s\s(\d+)(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+),(\d+)\s\[(.*)\]\s\((.*)\) - validateLogin\((.*)\)/){
        $logindate = "$1$2-$3-$4 $5:$6:$7,$8";
        $loginuser = "$11";
        if(($logging)&&($debug)){
            &writelog(1,"DEBUG: Tail Event Login found user date string = $logindate user = $loginuser");
        }
    }
    if (my $inp= ReadLine (-1)) {
        print "Got this command: $inp";
    }
}

And this would work, but the loop would only check for input anytime a line is added to the log, and block until then. If you don't want to do that you'll need to use File::Tail->select instead of read, take a look at the example that comes with File::Tail and the perldoc on that.


There are ten types of people: those that understand binary and those that don't.
Re^6: Reading terminal input while program is running
created: 2006-02-02 04:15:29
This works perfectly, simple and perfect thanks
Re^2: Reading terminal input while program is running
created: 2006-02-01 07:31:34
Or depending on his actual needs, even something like Curses.
Re: Reading terminal input while program is running
created: 2006-02-01 07:54:29
#!/usr/bin/perl
use warnings;
use strict;
use IO::Select;

# by edan of perlmonks
# I just remembered what select says about mixing 
# buffered reading and "select", so even though the 
# code works, you might want to substitute 
# the read via <$fh> with:
#    my $input;
#    sysread( $fh, $input, 1024);


# loop every 1 second
my $timeout = 1;

my $s = IO::Select->new();
$s->add( \*STDIN );

while (1) {
    if ( my @ready = $s->can_read($timeout) ) {

        # we got input

        for my $fh (@ready) {
            my $input = <$fh>;
            print "got: $input";
        }
    }
    else {

        # no input
    }

    # just to show that we're looping
    print scalar localtime,"\n";
}



I'm not really a human, but I play one on earth. flash japh

perlmonks.org content © perlmonks.org and blazar, minixman, tirwhan, zentara

prlmnks.org © 2006 edmund von der burg (eccles & toad)

v 0.03