2012-03-19 9 views
0

、正規表現は、この二重引用符で 次の正規表現が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は "Ronaldo"ですが、それはなぜ一致しませんか?

+0

'regexp" $ player_name。* ""ロナウドは素晴らしい "マッチ"ですか? –

+0

@TimPietzcker、いいえ、一致しません。 –

+0

OK、私はTclを全く知らないので、それは暗闇の中でのショットでした。私は 'regexp" Ronaldo "Ronaldoは素晴らしい" match "が正しくマッチすると期待していますか? –

答えて

4

これはあなたが期待していることではありません。カーリーbrancesあなたは括弧内に含まれる正確なバイト列の最初のパラメータを設定しているGET_PLAYER_INFOを呼び出すときに、すなわち、その中に何の変数置換を意味しません:1,"$name"

をプロシージャ内で、PLAYER_NAMEが正確$nameに設定されているので、あなたの正規表現のラインが展開to:

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)に特別な注意を払ってグループ化に関する部分。ソリューションをpatthoytsに加えて

+0

しかし、私はproc GET_PLAYER_INFOを変更しないで保存し、GET_PLAYER_INFO 1" $ name "のように呼び出すと動作し、player_nameは" Ronaldo "と等しいです、それは本当ですか? –

+0

GET_PLAYER_INFO 1 "$ name"のように渡すと、player_nameは "Ronaldo"に等しく、GET_PLAYER_INFO {1、 "$ name"}のように渡すと、player_nameは "$ name"に等しくなります違い? –

+0

このパラメータ解析はどのように機能しますか? –

2

私はここに別のバリアントを持っている:

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 

GET_PLAYER_INFOplayer_name引数が、それは$name変数のデフォルト値です(しかし、世話をする:$nameは、プロシージャ宣言の前に存在することがあります)を取得します。

+0

これは、スクリプトを解析するときに、変数からパラメータのデフォルト値を指定することが欠点です。それをハードコードして読みやすくすることもできます。このコードでは、グローバル名変数が将来変更された場合、この関数で使用されるデフォルト値は引き続き元の値になります。クロージャー関数を定義しようとしている場合を除き、これは望むものとは思えません。その場合は、実際には可変プロシージャーの名前が必要です。 – patthoyts

+0

はい、そうです。この変種では、デフォルト値は手続き宣言時に固定されています。 – bmk

関連する問題