tcl expect 到底是如何匹配输出的?

expect的规则看似简单,一旦进入书写代码阶段,首先碰到的就是匹配问题。深入理解这个匹配,后续的书写就会顺畅许多。

先看一段示例代码:

package require Expect

spawn echo "abcdef"

expect {
  a {
    puts a
    exp_continue
  }
  b {
   puts b
   exp_continue
  }
  a* {
    puts a*
    exp_continue
  }
  eof {}
  timeout {}
}


输出:

spawn echo abcdef
abcdef
a
b

匹配对象

expect似乎会记住最后一个匹配的位置(记作p),每次新的匹配都是从p开始。也可以描述成expect丢弃已经匹配的文本,保留尚未匹配的文本再加上接下来的输出(具体是什么情况不重要)。为什么得出这个结论呢?如果不是这样,上面的示例代码就会进入循环。a 和 a*。

匹配多少

如果是a这样的模式,你无法确定a到底匹配多少,只有在尾部特征的匹配才是可控的。如果是*f,那么必须等到f出现才会匹配,或者timeout 或者eof

$expect_out(buffer)

只有在匹配之后,该值才会最新的内容。同时也可以确定,匹配对象不是$expect_out(buffer).

必须是一问一答的模式

你不能在一个匹配中连续send数据,必须是一问一答的方式。以sql输入为例,必须在上一个sql结束后再次输入。

转载于:https://my.oschina.net/jianglibo/blog/656608

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值