switch
-
Имя
- switch — Оценка одного из нескольких скриптов в зависимости от заданного значения
- Синтаксис
- Описание
-
-exact
- -glob
- -regexp
- -nocase
- -matchvar varName
- -indexvar varName
- --
- -glob
Имя
switch — Оценка одного из нескольких скриптов в зависимости от заданного значенияСинтаксис
switch ?options? строка шаблон тело ?шаблон тело ...?switch ?options? строка {шаблон тело ?шаблон тело ...?}
Описание
Команда switch сопоставляет свой аргумент строка с каждым из аргументов шаблон в порядке следования. Как только она находит шаблон, который соответствует строке, она оценивает следующий аргумент тело, передавая его интерпретатору Tcl рекурсивно, и возвращает результат этой оценки. Если последний аргумент шаблон равен default, то он соответствует любому значению. Если ни один из аргументов шаблон не соответствует строке, и не указан параметр default, то команда switch возвращает пустую строку.Если начальные аргументы команды switch начинаются с -, то они обрабатываются как опции, если только нет ровно двух аргументов для switch (в этом случае первый должен быть строкой, а второй — списком шаблон/тело). В настоящее время поддерживаются следующие опции:
- -exact
- При сравнении строки с шаблоном используется точное соответствие. Это значение по умолчанию.
- -glob
- При сопоставлении строки с шаблонами используется сопоставление в стиле glob (т.е. такое же, как реализовано командой string match).
- -regexp
- При сопоставлении строки с шаблонами используется сопоставление с использованием регулярных выражений (как описано в справочной странице re_syntax).
- -nocase
- Приводит к тому, что сравнения обрабатываются без учета регистра.
- -matchvar varName
- Эта опция (допустима только при указании -regexp) задаёт имя переменной, в которую будет записан список совпадений, найденных механизмом регулярных выражений. Первый элемент списка будет представлять собой подстроку входной строки (т.е. аргумент строка команды switch), которая совпадает; второй элемент списка будет подстрокой, соответствующей первой группе захвата в регулярном выражении, которое совпало, и так далее. Когда выполняется ветвь default, в переменную записывается пустой список. Эта опция может быть указана вместе с опцией -indexvar.
- -indexvar varName
- Эта опция (допустима только при указании -regexp) задаёт имя переменной, в которую будет записан список индексов, относящихся к соответствующим подстрокам, найденным механизмом регулярных выражений. Первый элемент списка будет представлять собой список из двух элементов, определяющих индекс начала и индекс символа после конца всей подстроки входной строки (т.е. аргумент строка команды switch), которая совпала, аналогично опции -indices команды regexp. Аналогично, второй элемент списка относится к первой группе захвата в регулярном выражении, которое совпало, и так далее. Когда выполняется ветвь default, в переменную записывается пустой список. Эта опция может быть указана вместе с опцией -matchvar.
- --
- Отмечает конец опций. Аргумент, следующий за этим, будет обрабатываться как строка, даже если он начинается с -. Это необязательно, когда сопоставляющие шаблоны и тела сгруппированы вместе в одном аргументе.
Для аргументов шаблон и тело предоставляется два синтаксиса. Первый использует отдельный аргумент для каждого из шаблонов и команд; эта форма удобна, если требуются подстановки для некоторых из шаблонов или команд. Вторая форма помещает все шаблоны и команды вместе в один аргумент; аргумент должен иметь правильную структуру списка, где элементами списка являются шаблоны и команды. Вторая форма упрощает создание многострочных команд switch, так как фигурные скобки вокруг всего списка делают ненужным включение обратной косой черты в конце каждой строки. Поскольку аргументы шаблон заключены в фигурные скобки во второй форме, никакие команды или подстановки переменных к ним не применяются; это делает поведение второй формы отличным от первой формы в некоторых случаях.
Если тело задано как «-», это означает, что тело для следующего шаблона также должно использоваться как тело для этого шаблона (если следующий шаблон также имеет тело «-», то используется тело после него и так далее). Эта функция позволяет использовать одно и то же тело для нескольких шаблонов.
Обратите внимание на то, как вы размещаете комментарии в командах switch. Комментарии должны быть только внутри тела выполнения одного из шаблонов, а не смешиваться с шаблонами.
Примеры
Команда switch может сопоставлять переменные, а не только литералы, как показано здесь (результат — 2):set foo "abc"
switch abc a - b {expr {1}} $foo {expr {2}} default {expr {3}} Использование сопоставления в стиле glob и тела с проходом — это альтернатива написанию регулярных выражений с альтернациями, как показано здесь (это возвращает 1):
switch -glob aaab {
a*b -
b {expr {1}}
a* {expr {2}}
default {expr {3}}
} Когда ничего не соответствует, используется ветвь default (которая должна быть последней). В этом примере результат — 3:
switch xyz {
a -
b {
# Correct Comment Placement
expr {1}
}
c {
expr {2}
}
default {
expr {3}
}
} При сопоставлении с регулярными выражениями информация о том, что именно соответствует, легко получается с помощью опции -matchvar:
switch -regexp -matchvar foo -- $bar {
a(b*)c {
puts "Found [string length [lindex $foo 1]] 'b's"
}
d(e*)f(g*)h {
puts "Found [string length [lindex $foo 1]] 'e's and\
[string length [lindex $foo 2]] 'g's"
}
} См. также
for, if, regexp
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/switch.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/switch.htm