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]]

Это не будет хорошо, если у вас есть пробелы, встроенные в строку, или несколько других случаев, но без знания точных критериев того, что делает слово словом в исходном материале или как процитировать слова в системе, которая является принимая их, это лучшее, что вы можете получить. (Это по крайней мере дешево сделать это много...)

Другие вопросы по тегам