Spec-Zone.ru › Tcl/Tk

switch

Имя
switch — Оценка одного из нескольких скриптов в зависимости от заданного значения
Синтаксис
Описание
-exact
-glob
-regexp
-nocase
-matchvar varName
-indexvar varName
--
Примеры
См. также
Ключевые слова

Имя

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API