Expect的full_buffer

来源:互联网 发布:友笑网络 编辑:程序博客网 时间:2024/05/16 00:24
 

今天用Expect从一大堆输出中提取数据时出现问题,我是先把输出存入Tcl的一个字符串中再提取的,于是打印该字符串,发现只是屏幕输出的后一部分(而我想提取的值是在前半部分)。

起先以为是Tcl的字符串长度有限制,于是搜索“tcl字符串长度最大值”,未果,

后来改用GG搜索"tcl string length max",在一老外的论坛上有了结论,结论是Tcl对字符串长度可以说没有限制,达到21E多(4字节的int表示范围)。

于是怀疑是Expect的问题,

打印Expect_out(buffer)发现确实只保留了屏幕输出的后一部分,

在一个繁体网站上找到一个Match_max命令,以此为线索查看《Exploring Expect》,有个命令叫Match_max,可以设置匹配的最大长度

自己设置后没有效果,加-d后也不行,不知道为什么。。。

用Match_max搜索GG,有个老外碰到类似的问题,回答者是用full_buffer搞定的,看代码:

set mybuff ""
expect {
-re {.*00\-\->} {
append mybuff $expect_out(buffer);
}
full_buffer {
append mybuff $expect_out(buffer);
# continue as only place to break out is match above and eof
exp_continue
}
eof {
append mybuff $expect_out(buffer);
puts "eof [string length $mybuff ]"
}

}

其大概思想是出现full_buffer时就把expect_out(buffer)缓存起来,最后再将mybuff返回,

照此改造了下代码,OK

但我的代码有时是走不到full_buffer这个分支里面的,也就是改造之前大概有一半概率是能执行成功的,不知道为什么。。已经折腾了一天,先不纠结这个了。


原创粉丝点击