Re: run an interactive command using POE::Wheel?

"woosley. xu." <[email protected]>
Newsgroups gmane.comp.lang.perl.poe
Message-ID <[email protected]>
---------- Forwarded message ----------
From: woosley. xu. <[email protected]>
Date: 2009/9/25
Subject: Re: run an interactive command using POE::Wheel?
To: Andreas Altergott <[email protected]>


Hi, Andreas,
    Thanks for your reply.
     I found if I changed the my code to

                   $_[HEAP]->{job}->put("woosley\npassword");

  just like you did, then the get_name.pl can get the username and password
correctly.

   Then I changed the code like this

            $_[HEAP]->{job}->put("woosley");
            $_[HEAP]->{job}->put("password");
It worked this time.

Still I don't know why I can not put a "\n" after each words, perldoc
POE::Wheel::Run says
*POE::Wheel::Run communicates with the child process in a line-based fashion
by default*

besides, if you write the interactive code like this:

    my $user = <STDIN>;
    chomp $user;
    $_[HEAP]->{job}->put("$user");
    my $pass = <STDIN>;
    chomp $pass;
    $_[HEAP]->{job}->put("$pass");

It won't pop up all the message from the child process until you finished
all your input. Maybe this is not the right way to do it, I am wondering
which is the way.

2009/9/25 Andreas Altergott <[email protected]>

 Hi,
>
> woosley. xu. wrote:
> > Apparently I failed to get the password but get the last "\n" in the
> first
> > input to password.  But if I got rid of "\n", the whole script just
> blocked.
> > How can I deal with such a situation?
>
> I didn't find the error, but I've written your application a little bit
> different.  This is working for me.  Maybe it helps you to find
> something.  Please let me (us on the mailing list ;-) ) know if you do.
>  Sorry if I'm not of much help.  I really didn't see the mistake.
> Probably it has something to do with the StdioFilter that is missing in
> your code.
>
> I'm new to POE, so I don't have any answer for you second question.
>
> #!/usr/bin/perl
> #-----------------------------------------------------------------------
> # main.pl
>
> use strict;
> use warnings;
>
> use POE qw(Wheel::Run Filter::Line);
>
> sub _start {
>    my ($kernel, $heap) = @_[KERNEL, HEAP];
>
>    $heap->{'child'} = POE::Wheel::Run->new(
>        'CloseEvent'   => 'child_close',
>        'Program'      => ['perl', 'child.pl'],
>        'StderrEvent'  => 'child_stderr',
>        'StdoutEvent'  => 'child_stdout',
>        'StdioFilter'  => POE::Filter::Line->new(),
>        'StderrFilter' => POE::Filter::Line->new()
>    );
>
>    $kernel->sig_child($heap->{'child'}->PID, 'sig_chld');
>    $heap->{'child'}->put("user\npw\n");
> }
>
> sub child_close {
>    my ($kernel, $heap) = @_[KERNEL, HEAP];
>
>    delete($heap->{'child'});
> }
>
> sub child_stderr {
>    my $stderr = $_[ARG0];
>
>    print("$stderr\n");
> }
>
> sub child_stdout {
>    my $stdout = $_[ARG0];
>
>    print("$stdout\n");
> }
>
> sub sig_chld {
> }
>
> POE::Session->create(
>    inline_states => {
>         '_start'       => \&_start,
>        'child_close'  => \&child_close,
>        'child_stderr' => \&child_stderr,
>        'child_stdout' => \&child_stdout,
>        'sig_chld'     => \&sig_chld
>    }
> );
>
> POE::Kernel->run();
> exit(0);
>
> # EOF
> #-----------------------------------------------------------------------
>
> #!/usr/bin/perl
> #-----------------------------------------------------------------------
> # child.pl
>
> use strict;
> use warnings;
>
> my ($user, $pw);
>
> print("User:\n");
> $user = <STDIN>;
>
> print("Password:\n");
> $pw = <STDIN>;
>
> chomp($user);
> chomp($pw);
>
> print("Entered: $user/$pw\n");
>
> # EOF
> #-----------------------------------------------------------------------
>
>
> Regards,
> Andreas
>
>


-- 
Woosley.Xu
Tju->PMO->Rdps



-- 
Woosley.Xu
Tju->PMO->Rdps
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.