在列表中传递变量并期望其字面值

Pass variable in list and expect its literal value

我试图编写一个简单的脚本,其中我从一些现有变量中创建一个列表,当我打印相同的内容时期望它的字面值:

set testString "John A. Smith, Mobile:001-445-4567-0987, Pin-556789"
set results  { address contact $testString }
puts $results

但我得到以下输出:

address contact $testString 

我期待的地方 - 我怎样才能达到同样的效果:

address contact John A. Smith, Mobile:001-445-4567-0987, Pin-556789 

当你这样做时:

set results  { address contact $testString }

您正在创建一个文字字符串(没有替换)并将其分配给一个变量。这就是 {…} 所做的;除了可嵌套外,它就像 Unix shell 中的 'single quotes'

要在其中进行替换,您可以使用 " 双引号 ",或者通过 subst 命令 运行 文字字符串:

set results " address contact $testString "
set results [subst { address contact $testString }]

大括号防止替换变量,因此请改用双引号:

set results " address contact $testString "
puts $results
#  address contact John A. Smith, Mobile:001-445-4567-0987, Pin-556789

或使用subst强制替换:

set results { address contact $testString }
set results [subst $results]
puts $results
#  address contact John A. Smith, Mobile:001-445-4567-0987, Pin-556789

或者,如果您实际上想要一个列表,其中第一个元素是 address,第二个元素是 contact,第三个元素是 $testString 的值,那么您可以使用 list,只是输出看起来不同:

set results [list address contact $testString]
puts $results
# address contact {John A. Smith, Mobile:001-445-4567-0987, Pin-556789}

但是那样的话,如果你做 lindex $results 2 这样的事情,你可以得到 testString ,而如果你使用任何早期的方法,你只会得到 [=18] 的第一个单词=],即John.