Re: How to control the loop within expect.
Available news archives: comp.lang.tcl - comp.lang.python - comp.security.firewalls - sci.crypt - comp.lang.php - comp.lang.javascript
Google
 
Web news.hping.org


comp.lang.tcl archive

Re: How to control the loop within expect.

From: Hu Junfeng <hujunfeng@gmail.com>
Date: Sat Apr 29 2006 - 07:00:18 CEST

Bruce Hartweg 写道:

> hujunfeng@gmail.com wrote:
> > I just met a problem when I have a loop and an expect in this loop.
> > for example
> > for {set i 1} {i<10} {incr i} {
> > send a commanda
> > expect {
> > 1 {puts 1}
> > 2 {puts 2}
> > 3 {........}
> > }
> > send a commandb
> > }
> > when I get the value 1, I will puts 1 and execute the commandb, so as
> > 2.but my question is if I get the value 3, I want to continue the loop
> > but not execute send the commandb.
> > I've used break or exit , these all seemed exit the loop.
> > Do anybody knows this?
> > Thanks.
> >
> 2 things,
> As others have mentioned you can use expect itself as the looping
> construct (i.e. if you want to keep doing the same interactions until some
> condition of the interaction makes you want to stop. in this case you
> just add exp_continue to each branch that doesn't want you to stop.
>
> If the above example is actually what you are wanting (i.e. the loop condition
> is *external* to your interaction, and you have other code in your loop
> in addition to the expect, you can use the normal tcl continue to stop
> the current loop body and continue to the next one
>
> for {set i 1} {i<10} {incr i} {
> send a commanda
> expect {
> 1 {puts 1}
> 2 {puts 2}
> 3 {
> ........
> continue
> }
> }
> send a commandb
> }
>
>
>
> Bruce

Thanks, it works:)
But I find another problem with it ,if I put the continue in a
procedure, it will not works again. for example:

proc CMD {con} {
        upvar CMDSUCC CMDSUCC
        upvar CMDFAIL CMDFAIL
               send -i $con "cd /nodes\r"
                expect {
                        -i $con
                        $CMDSUCC {
                                puts "succe"
                                continue
                        }
                        $CMDFAIL {
                                puts "fail"
                                continue
                        }
                }
                puts "123"
        }

set i 0
if {$i==0} {
        foreach $i {1 2 3 4 5} {
        CMD $CLICom
        }
} else {
        puts "hehe"
}

the result is
invoked "continue" outside of a loop
Received on Sun Apr 30 03:31:14 2006