2015-06-22 3 views
2

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

expect { 
    timeout {puts timedout\n} 
    \[1\]: {puts matched\n} 
} 


> expect test.tcl 
[1]: 
timedout 

Если изменить его и удалить двоеточие матч работает:

expect { timeout {puts timedout\n} \[1\] {puts matched\n} }

$ expect test.tcl [1] matched

Или, если я избавлюсь от 1-го кронштейна

expect { timeout {puts timedout\n} 1\]: {puts matched\n} } то это соответствует:

$ expect test.tcl 1]: matched

ответ

3

Это не проблема с :, но с [.

[ является особенным как для 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

+0

Спасибо. Я не понимал, что на работе есть 2 уровня косвенности. Ждал только один ... – sashang

1

Узоры, которые работали для меня:

  • -exact {[1]:}
  • -exact "\[1]:"
  • {\[1]:}
  • "\\\[1]:"
Смежные вопросы