TCL String Manipulation с фигурными скобками
Я изменяю скрипт возврата приложения в JACL. Этот скрипт предназначен для поиска строки аргумента JVM, которую мы хотим удалить в аргументах JVM сервера. Новый для приложения этот цикл выпуска является аргументом jvm ${variable_name}. Мой старый код
set ixReplace [lsearch -exact $jvm_args "string_to_search"]
set jvm_args [lreplace $jvm_args $ixReplace $ixReplace]
теперь возвращает дополнительный набор {}, как это
-Xjit: отключить OSR -Xgc: предпочитаемый HeapBase=0x100000000 -Xmnx1152m -Xmns512m -Xgcpolicy:gencon -agentlib:getClasses -noverify {${variable_name}}
Я нашел несколько статей о том, как удалить лишний {} здесь и здесь, но я не могу установить результаты в переменную, которую я использую для установки новых аргументов jvm.
Моя конечная цель - установить правильную строку в переменную с именем jvm_args, чтобы я мог использовать ее для обновления аргументов JVM следующим образом.
set attr {}
lappend attr [list genericJvmArguments $jvm_args]
$AdminConfig modify $server_jvm_id $attr
Любая помощь или предложения будут с благодарностью.
1 ответ
Tcl добавляет эти скобки, потому что у вас есть правильно сформированный список Tcl после lreplace
операция, а не любая старая строка. Брекеты останавливают ${variable_name}
когда-либо интерпретироваться как переменная замена; $
является метасинтаксическим символом Tcl (Квадратные скобки также привлекут кавычки, как и некоторые другие символы.)
Однако вы хотите передать результат в контекст, который не ожидает список Tcl, а, скорее всего, простую строку, разделенную пробелами. Самый простой подход - просто использовать join
в тот момент, когда вы перестаете думать о наличии списка слов Tcl и начинаете думать о наличии общей строки, вероятно, так:
lappend attr [list genericJvmArguments [join $jvm_args]]
Это не будет хорошо, если у вас есть пробелы, встроенные в строку, или несколько других случаев, но без знания точных критериев того, что делает слово словом в исходном материале или как процитировать слова в системе, которая является принимая их, это лучшее, что вы можете получить. (Это по крайней мере дешево сделать это много...)