【问题标题】:TCL regsub uses RegEx match as index in associate arrayTCL regsub 使用 RegEx 匹配作为关联数组中的索引
【发布时间】:2019-10-11 19:46:39
【问题描述】:

我想自动转换网址,即

我在 TCL 中尝试过以下代码 sn-p

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)]NOT 评估并进一步替换为实际值。任何提示将不胜感激。提前致谢

【问题讨论】:

  • 也许使用string map 这个?如果要转换的网站名称集不是太大...

标签: tcl regsub


【解决方案1】:

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

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

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

要克服这个问题,您必须通过subst 进一步处理 regsub 处理的字符串:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2011-05-06
    • 2018-06-28
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多