为什么以下正则表达式在tcl中不起作用?

时间:2012-03-19 09:28:03

标签: regex tcl

我正在阅读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是“罗纳尔多”,但为什么不匹配?

2 个答案:

答案 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必须在过程声明之前存在)。