Как проверить, существует ли элемент списка в TCL?

Скажем, у меня есть список TCL, и я добавил некоторые элементы в свой список. Теперь я хочу проверить, добавил ли я 6 или 7 элементов.

Чтобы проверить, существует ли элемент списка в месте, указанном индексом, я использовал:

if { [info exists [lindex $myList 6]] } {
#if I am here then I have appended 7 elems, otherwise it should be at least 6
}

Но швы это не работает. Как мне это сделать? должным образом? Можно проверить, если { [lindex $myList 6]] eq ""


person Narek    schedule 11.04.2011    source источник


Ответы (3)


Я нашел этот вопрос, потому что хотел проверить, содержит ли список определенный элемент, а не просто проверять длину списка.

Чтобы узнать, существует ли элемент в списке, используйте lsearch функция:

if {[lsearch -exact $myList 4] >= 0} {
    puts "Found 4 in myList!"
}

Функция lsearch возвращает индекс первого найденного элемента или -1, если данный элемент не был найден. С помощью параметров -exact, -glob (по умолчанию) или -regexp можно указать тип поиска по шаблону.

person FriendFX    schedule 10.07.2015

Почему бы вам не использовать llength для проверки длины вашего списка:

if {[llength $myList] == 6} {
    # do something
}

Конечно, если вы хотите проверить элемент по определенному индексу, используйте lindex, чтобы получить этот элемент и проверить его. например if {[lindex $myList 6] == "something"}

Ваш код, использующий info exists, не работает, потому что команда info exists проверяет, существует ли переменная. Таким образом, вы в основном проверяете, есть ли переменная, имя которой равно значению, возвращаемому [lindex $myList 6].

person überjesus    schedule 11.04.2011
comment
Что вы имеете в виду мое-то? Я использовал if {[lindex $myList 6]] eq }, чтобы проверить, существует ли 7-й элемент. Если он не существует, я нахожусь в теле оператора if. Рекомендуется использовать? - person Narek; 11.04.2011
comment
что-то просто случайная строка, которую я выбрал для своего примера. Вы, конечно, можете заменить это любой строкой, которая вам нравится. if {[lindex $myList 6]] == ""}, скорее всего, будет работать, но у него есть недостаток. Предположим, у вас есть следующий список: set l {1 2 3 4 5 6 ""}. Этот список состоит из 7 элементов (проверьте вывод llength $l). Но ваш код будет обрабатывать этот список так, как будто в нем всего 6 элементов. Если вы хотите проверить, существует ли элемент по индексу X, используйте llength, чтобы проверить, является ли список таким длинным, это определенно более явно. Если вы не хотите проверять, имеет ли элемент определенное значение, используйте lindex. - person überjesus; 11.04.2011
comment
Стоит отметить, что решение, которое использует OP ([lindex $mylist 6]), семантически не эквивалентно вопросу, который он пытается задать (есть ли в этом списке 6 элементов). Я большой сторонник того, чтобы код выражал то, чего он пытается достичь. Ответ, опубликованный здесь überjesus ([llength $mylist] == ​​6), выражает вопрос, который на самом деле задают, поэтому, даже если оба работают правильно, это будет лучший вариант. - person RHSeeger; 13.04.2011

Другой способ проверить наличие списка в TCL — просто использовать 'in', например:

if {"4" in $myList} {
    puts "Found 4 in my list"
}

Это немного чище/более читабельно!

person Andrew Rooney    schedule 08.08.2019