нам нужно сбросить переменные в TCL?

Является ли это требованием хорошего кода TCL? Что произойдет, если мы не будем использовать в скрипте ключевое слово «unset»? О каких-либо побочных эффектах мне следует знать?

Я унаследовал какой-то устаревший код, и ошибки, возникающие из-за «неустановленных» несуществующих переменных, доводят меня до отчаяния!


person chronodekar    schedule 25.02.2010    source источник


Ответы (5)


Перед использованием можно определить, существует ли переменная, используя info exists команда. Убедитесь, что если вы не используете unset, вы не нарушите логику программы в другом месте.

Нет никакой специфичной для Tcl причины для unset переменной, то есть это не приведет к утечке памяти или исчерпанию дескрипторов переменных или чему-то в этом роде. Использование unset может быть защитной практикой программирования, потому что оно предотвращает использование переменной в будущем после того, как она больше не актуальна. Не зная больше о точном коде, с которым вы работаете, трудно дать более подробную информацию.

person Greg Hewgill    schedule 25.02.2010
comment
Никаких утечек памяти и тому подобного. Как раз то, что я надеялся услышать! Теперь я могу запретить эти идиотские настройки по всему коду. Да, глядя на это сейчас, мне тоже кажется, что это скорее защитное программирование. Тем не менее, в моем случае это выглядит как слишком много защиты. информация существует для меня новая - спасибо! - person chronodekar; 25.02.2010

В дополнение к другим ответам, если ваша версия Tcl достаточно новая, вы также можете использовать:

unset -nocomplain foo

Это отключит foo, если он существует, но не будет жаловаться, если его нет.

person Jeff Godfrey    schedule 26.02.2010
comment
Где «достаточно новый» охватывает все доступные версии - person Donal Fellows; 16.11.2020

В зависимости от системной статистики это может привести к проблеме «невозможно выделить байты», когда ваш скрипт хранит огромные данные в переменных и массивах. он сломается, как только кеш или ОЗУ будут заполнены, говоря «невозможно выделить XXXXXXXX байт».

Убедитесь, что вы не храните так много данных в переменных, в противном случае отключите их после завершения использования соответствующих наборов данных (переменных).

person Narasimha Rao    schedule 27.02.2014

Для заметки, поскольку я, похоже, не могу комментировать приведенную выше «информацию существует»;

Я часто использую эту форму..

if { [info exists pie] && [$pie == "ThisIsWhatIWantInPie"]} {
    puts "I found what I wanted in pie."
} else {
    puts "Pie did not exist; but I still did not error,TCL's evaluation \
          will see the conditional failed on the [info exists] and not \
          continue onto the comparison."
}
person wom    schedule 03.03.2010

В дополнение к другим ответам я хочу добавить, что если вы хотите пренебречь ошибками, возникающими в результате удаления несуществующей переменной, используйте «поймать».

#!/bin/bash

catch {unset newVariable}
person Ankush Pandit    schedule 16.11.2020