我正在阅读TCL中的一些代码,正则表达式不起作用,
set name "Ronaldo"
proc GET_PLAYER_INFO {player_id {player_name "$name"}} {
global name
regexp "$player_name" "Ronaldo is awesome" match
puts $match
}
GET_PLAYER_INFO {1,"$name"}
在这个双引号中,“$ player_name”被“$ name”取代? $ name是“罗纳尔多”,但为什么不匹配?
答案 0 :(得分:4)
这不符合你的期望。 Curly brances意味着它们中没有变量替换,因此当您调用GET_PLAYER_INFO时,您将第一个参数设置为括号内包含的确切字节序列,即:1,"$name"
在此过程中,player_name设置为$name
,因此您的正则表达式行扩展为:
regexp '$name' "Ronaldo is awesome" match
因此它会尝试匹配行尾和“名称”。
如果你想使用一个变量默认参数,你应该把它设置为一些保护值,然后在没有修改时从外部源检索它,例如:
proc proc GET_PLAYER_INFO {player_id {player_name ""}} {
global name
if {$player_name eq ""} { set player_name $name }
regexp "$player_name" "Ronaldo is awesome" match
puts $match
}
仔细阅读Tcl(1),特别注意有关分组的部分。
答案 1 :(得分:2)
除了patthoyts解决方案,我还有另一种变体:
set name "Ronaldo"
proc GET_PLAYER_INFO [list player_id [list player_name "$name"]] {
regexp "$player_name" "Ronaldo is awesome" match
puts $match
}
GET_PLAYER_INFO 1 $name
player_name
的{{1}}参数将从GET_PLAYER_INFO
变量中获取它的默认值(但请注意:$name
必须在过程声明之前存在)。