1

我想自动转换网址,即

我在 TCL 中尝试过以下代码片段

set loc "https://sc-uat.ct.example.com/sc/"

set envs(dev) "test"
set envs(uat) "beta"
set envs(qa) "demo"

puts $envs(uat)
regsub -nocase {://.+-(.+).ct.example.com} $loc {://inv[$envs(\1)].example.com} hostname

puts "new location = $hostname"

但结果是:新位置 = https://inv[ $envs(uat)].example.com/sc/

似乎[$envs(uat)]没有被评估并用实际值进一步替换。任何提示将不胜感激。提前致谢

4

1 回答 1

1

但结果是: new location = https://inv[ $envs(uat)].example.com/sc/ 似乎 [$envs(uat)] 被进一步评估。

你的意思是说:[$envs(uat)]不是进一步评估?

这是因为由于 中的大括号{://inv[$envs(\1)].example.com},插入字符串是按字面意思获取的,而不是进行变量或命令替换。此外,您不需要命令和变量替换 ( [$envs(\1)]),只需其中之一:$envs(\1)[set envs(\1)].

为了克服这个问题,您必须通过以下方式进一步处理 regsub 处理的字符串subst

set hostname [subst -nocommands -nobackslashes [regsub -nocase {://.+-(.+).ct.example.com} $loc {://inv$envs(\1).example.com}]]

改进建议

我建议避免subst在这种情况下使用,因为即使受到限制,您也可能会遇到与主机名中的 Tcl 特殊字符(例如,IPv6 授权部分中的括号)发生冲突。要么您必须先清理loc字符串,要么更好地处理字符串范围,如下所示:

if {[regexp -indices {://(.+-(.+)).ct.example.com} $loc _ replaceRange keyRange]} {
    set key [string range $loc {*}$keyRange]
    set sub [string cat "inv" $envs($key)]
    set hostname [string replace $loc {*}$replaceRange $sub]
}
于 2019-10-11T11:10:27.730 回答