почему следующее регулярное выражение не работает в tcl? - PullRequest
0 голосов
/ 19 марта 2012

Я читаю некоторый код в 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 называется "Ronaldo", но почему оно не совпадает?

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

Это не делает то, что вы ожидаете. Вьющиеся переходы означают, что в них нет подстановки переменных, поэтому, когда вы вызываете GET_PLAYER_INFO, вы устанавливаете для первого параметра точную последовательность байтов, содержащуюся в фигурных скобках, то есть: 1,"$name"

В рамках процедуры имя_плеера установлено равным $name, поэтому ваша строка регулярного выражения расширяется до:

regexp '$name' "Ronaldo is awesome" match

Таким образом, он пытается сопоставить конец строки с последующим «name».

Если вы хотите использовать переменный параметр по умолчанию, вам действительно следует установить для него некоторое защитное значение, а затем извлечь его из внешнего источника, когда он не изменен, например:

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) , уделяя особое внимание частям, касающимся группировки.

2 голосов
/ 19 марта 2012

Помимо решения патхойц, у меня есть еще один вариант:

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 GET_PLAYER_INFO получит значение по умолчанию из переменной $name (но учтите: $name должно существовать до объявления процедуры).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...