tc1364 has asked for the wisdom of the Perl Monks concerning the following question:

When the response "EMPTY TABLE" is returned, the below code doesn't execute the "next" command. The code just hanges. The exp_continue command has the same results. There are two possible values returned, one is "EMPTY TABLE" and the other is "TOP". Breaking the two responses into seperate calls causes the code to hang in the other direction. Can you please assist me with having the "next" or similar command to cause excution to begin with the next $table?

foreach $table (@tables) { $exp->expect(3600, [ qr/>/i, sub { my $self = shift; sleep(1); $self->send("TABLE $table; FORMAT 132 PACK\r"); }]); $exp->expect(3600, [ qr/UNKNOWN TABLE/i, sub { my $self = shift; sleep(1); $self->send("abort\r"); next; }], [ qr/TABLE: $table/i, sub { my $self = shift; $self->send(""); }]); $exp->expect(3600, [ qr/The first column/i, sub { my $self = shift; sleep(1); $self->send("LIS ALL\r"); }]); $exp->expect(3600, [ qr/EMPTY TABLE/i, sub { my $self = shift; sleep(1); next; }], [ qr/TOP/i, sub { my $self = shift; $self->send(""); }]); $exp->expect(3600, [ qr/BOTTOM/i, sub { my $self = shift; sleep(1); $self->send("quit all\r"); }]); }

20050428 Cleaned up by Corion: Added formatting, fixed wrong code tag

Replies are listed 'Best First'.
Re: Next & Last - Perl's Expect
by moot (Chaplain) on Apr 28, 2005 at 20:28 UTC
    You are trying to next in a loop outside of the scope in which the next is executed. The 'next' occurs in a subroutine which has no contextual relevance to the containing loop.
Re: Next & Last - Perl's Expect
by ikegami (Patriarch) on Apr 28, 2005 at 20:44 UTC

    moot explained the problem. Here's how to work around it:

    my $next = 0; $exp->expect(3600, [ qr/UNKNOWN TABLE/i, sub { my $self = shift; sleep(1); $self->send("abort\r"); $next = 1; }], [ qr/TABLE: $table/i, sub { my $self = shift; $self->send(""); }]); next if $next;
      This worked great! Thank you very much! So, the trouble was exactly what you mentioned being that the "next" command was not being reconginzed because it was in the Expect call.

        No, it has nothing to do with Expect. The problem was that the sub in which next was located did not have a loop. next doesn't work beyond a sub. That's because next is a keyword, not a function. Keywords have meaning at compile-time, but the caller of the sub is only known at run-time.

        Note that perl 6 will convert next into a special die, so it might work as you expected, depending on the guts of Expect.

Re: Next & Last - Perl's Expect
by Roy Johnson (Monsignor) on Apr 28, 2005 at 20:30 UTC
    After it gets EMPTY TABLE and does next, it's going to be expecting a new prompt. Is there one waiting for it, or do you need to send something?

    Caution: Contents may have been coded under pressure.