Почему в этом ожидаемом коде не выполняется сопоставление строк?

Я создал следующую процедуру, предназначенную для работы с симулятором базовой станции Agilent:

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:СИСТЕМА:ПРИЛОЖЕНИЕ? Строка 2. Отправка bss_str: en;05 "CDMA 2000 Lab App T"

не могу прочитать "expect_out(buffer)": такой переменной нет при выполнении "set receive_buffer $expect_out(buffer)" (процедура "get_bss_parameter_value", строка 20)

================================================== ====== Если "." заменить на "" в приведенном выше коде, это ВЫВОД:

Строка 1

>

oa;05:СИСТЕМА:ПРИЛОЖЕНИЕ? Строка 2 Отправка bss_str: en;05 receive_buffer START:

oa;05:СИСТЕМА:ПРИЛОЖЕНИЕ?

КОНЕЦ Текущее приложение

oa;05:СИСТЕМА:ПРИЛОЖЕНИЕ?

Проблема:
1) Я не могу получить значение "CDMA 2000 Lab App T" в переменной expect_out(buffer), которое должно соответствовать (из-за .*) выходным данным устройства Agilent. Что-то не так с кодом?
2) В обоих случаях команда "en;05" отправляется, но не отображается на стандартном выходе. Хотя мы можем увидеть ожидаемый результат в первом случае.


person Community    schedule 05.05.2009    source источник


Ответы (2)


Обратите внимание, что команда [expect] по умолчанию выполняет glob-style соответствие, а не стиль регулярных выражений. Итак, где вы пишете:

expect .*

на самом деле вы ищете строку, начинающуюся с буквальной точки, за которой следует любое количество символов. Поскольку это не соответствует, массив expect_out не заполняется. Как вы упоминаете

expect *

ведет себя так, как вы ожидаете, потому что шаблон глобуса "*" соответствует любой строке.

Если вы действительно хотите ".*", вам нужно указать

expect -re .*
set receive_buffer $expect_out(buffer)
person glenn jackman    schedule 02.06.2009

У меня сложилось впечатление, что переменная expect_out была глобальной. Если я прав, то вам понадобится следующее:

global expect_out

Или вы можете явно ссылаться на него как на глобальный, используя квалификатор пространства имен "::"

set receive_buffer $::expect_out(buffer)
person RHSeeger    schedule 06.05.2009