TCL 带花括号的字符串操作

TCL String Manipulation with curly braces

我正在修改 JACL 中的应用程序撤销脚本。此脚本旨在搜索我们要在服务器的 JVM 参数中删除的 JVM 参数字符串。此发布周期的应用程序的新功能是 jvm 参数 ${variable_name}。我的旧代码

set ixReplace [lsearch -exact $jvm_args "string_to_search"]
set jvm_args [lreplace $jvm_args $ixReplace $ixReplace]

现在 returns 一组额外的 {} 像这样

-Xjit:disableOSR -Xgc:preferredHeapBase=0x100000000 -Xmnx1152m -Xmns512m
-Xgcpolicy:gencon -agentlib:getClasses -noverify {${variable_name}}

我找到了多篇关于如何删除多余的 {} 的文章 here and here,但我似乎无法将结果设置为我用来设置新 jvm 参数的变量。

我的最终目标是将正确的字符串设置为一个名为 jvm_args 的变量,这样我就可以像这样更新 JVM 参数。

set attr {}
lappend attr [list genericJvmArguments  $jvm_args]
$AdminConfig modify $server_jvm_id $attr

如有任何帮助或建议,我们将不胜感激。

Tcl 添加这些大括号是因为在 lreplace 操作之后您有一个 格式良好的 Tcl 列表,而不是任何旧字符串。大括号阻止 ${variable_name} 被解释为变量替换; $ 是一个 Tcl 元语法字符。 (方括号也会吸引引号,其他一些字符也是如此。)

但是,您希望将结果提供给不期望 Tcl 列表的上下文,而可能是一个简单的 space 分隔字符串。最简单的方法是在您不再考虑使用 Tcl 单词列表并开始考虑使用通用字符串时使用 join,可能像这样:

lappend attr [list genericJvmArguments [join $jvm_args]]

如果你在字符串中嵌入了 spaces,或者其他一些情况,但不知道在源中使一个词成为一个词的确切标准,它将无法很好地应对material 或者如何在系统中引用它们,这是你可能得到的最好的。 (做这么多,至少便宜了。。。)