Это не проблема с :
, но с [
.
[
является особенным как для Tcl
, так и для графического шаблона Expect
, поэтому он особенно грязный. Чтобы соответствовать литералу [
, вы должны обратную косую черту один раз от Tcl
, а затем снова, чтобы он не рассматривался как диапазон во время сопоставления с образцом. Первая обратная косая черта, конечно же, должна быть обратной, чтобы она не превратила следующую обратную косую черту в буквальную обратную косую черту!
expect "\\\[" ; #matches literal '['
Таким образом, ваш код должен быть,
expect {
timeout {puts timedout\n}
\\\[1]: {puts matched\n}
}
Вы можете предварить ]
с обратной косой черты, если она заставляет вас чувствовать себя хорошо, но это не необходимости. Поскольку в строке с двойными кавычками нет соответствующей левосторонней скобки, ничего не происходит с правой скобой. Он выступает сам по себе и передается команде Expect
, где затем интерпретируется как конец диапазона.
Следующий набор примеров показывает поведение [
в качестве шаблона, которому предшествуют разные числа обратных косых черт. Если [
не имеет префикса обратной косой чертой, Tcl
интерпретирует все, что следует за командой. Для этих примеров представьте, что существует процедура с именем XY
, которая возвращает строку n*w
.
expect" [XY]" ; # matches n followed by anything
expect "\[XY]" ; # matches X or Y
expect "\\[XY]" ; # matches n followed by anything followed by w
expect "\\\[XY]" ; # matches [XYl
expect "\\\\[XY]" ; # matches \ followed by n followed ...
expect "\\\\\[XY]" ; # matches sequence of \ and X or Y
Корпус \\[XY]
заслуживает пристального внимания. Tcl
интерпретирует первую обратную косую черту как среднюю букву. Tcl
затем производит n*w
в результате команды XY. Соединитель шаблонов в конечном счете видит четыре строки символов n*w
. Соединитель шаблонов интерпретирует это обычным способом. Обратная косая черта указывает на то, что значение n
должно быть сопоставлено буквально (что было бы даже без обратной косой черты, поскольку n не является особым для шаблона).
Источник: Exploring Expect
Спасибо. Я не понимал, что на работе есть 2 уровня косвенности. Ждал только один ... – sashang