为什么字符串匹配在这个“期望”代码中失败?

时间:2009-05-05 23:49:28

标签: tcl expect

我已经创建了以下程序,期望使用Agilent Base Station Simulator:

proc get_bss_parameter_value {bss parameter_string} {
global bss_array

set bss_str "$parameter_string?"

puts "String 1"
set bss_str "oa;$bss_array(gpib):$bss_str\r"
send "$bss_str"
expect {nopattern^}

puts "String 2"
set bss_str "en;$bss_array(gpib)"
puts "Sending bss_str: $bss_str"
send "$bss_str\r"
expect .*

set receive_buffer $expect_out(buffer)
puts "receive_buffer START: $receive_buffer"
puts "END"

return $receive_buffer
}

=============================================== ========= 输出:

字符串1

>

  

OA; 05:SYST:APPL?   字符串2   发送bss_str:en; 05   “CDMA 2000 Lab App T”

     

无法读取“expect_out(缓冲区)”:没有这样的变量       执行时   “set receive_buffer $ expect_out(buffer)”       (程序“get_bss_parameter_value”第20行)

=============================================== ========= 如果在上面的代码中“。”被“”替换,那么这就是OUTPUT:

字符串1

>

  

OA; 05:SYST:APPL?   字符串2   发送bss_str:en; 05   receive_buffer START:

     

OA; 05:SYST:APPL

     

END   目前的申请是

     

OA; 05:SYST:APPL

问题:
1)我无法在expect_out(缓冲区)变量中获得值“CDMA 2000 Lab App T”,该变量应与安捷伦设备的输出匹配(由于。*)。代码有问题吗?
2)在这两种情况下,命令“en; 05”都会发送但不会显示在stdout上。虽然我们可以在第一种情况下看到预期的输出。

2 个答案:

答案 0 :(得分:1)

请注意,[expect]命令默认为glob-style匹配,而不是regexp-style。所以,你写的地方:

expect .*

你实际上在寻找一个以文字点开头,后跟任意数量字符的字符串。由于无法匹配,所以expect_out数组不会被填充。正如你提到的那样

expect *

表现得如你所愿,因为glob模式“*”匹配任何字符串。

如果你真的想要“。*”,那么你需要指定

expect -re .*
set receive_buffer $expect_out(buffer)

答案 1 :(得分:0)

我认为expect_out变量是全局变量。如果我是对的,那么你需要以下内容:

global expect_out

或者,您可以使用命名空间限定符“::”

显式地将其称为全局
set receive_buffer $::expect_out(buffer)