2017-03-09 11 views
0

Ifブロックが特定のファイル内にあるかどうかを調べたいと思います。Tcl [regexp]:変数が内部にあるブロックと一致する場合の式

次のように私は、ファイルnew.tclを持っている:

if { [info exists var1] } { 
    if { "$var1" == "val1" } { 
    puts "var1 has value as val1" 
    } 
} else { 
    puts "var1 does not exists" 
} 

私は別のTcl関数でこのファイルを読み込み、regexp機能と、この機能で使用される値と変数を介しあればブロックを一致させよう変数です。私の実装ファイルがどのように見える

set valueDict [list 'var1' 'val1'] 
set valDictLen [llength $valueDict] 
set myFilePtr [open "new.tcl" "r"] 
set myFileContent [read $myFilePtr] 
close $myFilePtr 

for { set index 0 } { $index < $valDictLen } { incr index 2 } { 
    set currVar [lindex $valueDict $index] 
    set currVal [lindex $valueDict [expr $index + 1]] 

    # I actually want to match the entire if block content here 
    if { ![regexp "if \{ \[info exists $currVal\] \}" $myFileContent] } { 
    puts "Code not present" 
    } 
} 
+1

\ s *?{\ s *?\ [info exists var1 \ s *?] \ s *のような正規表現を使用すると、 ''(?:\ n | ^) } \ s *?{。*?\ n}(?:\ n | $) '](https://regex101.com/r/PUpBvb/1)(Tclではテストされていません)、すべてのケースでうまくいくとは思えません。正規表現でコードを解析することは、一般的には悪い考えです。 –

+0

注意変数 '$ currVal'を' var1'の代わりに正規表現の中で使いたいのですが – Ashwin

+0

この答えを見て、それがあなたの問題を解決するかどうか教えてください:http://stackoverflow.com/questions/14237376/how-to-use-regexp-to-match-a-tcl – user2141046

答えて

-1

試してみてください。

if { ![regexp "if *{ *[info exists $currVal] *}" $myFileContent] } { 
    puts "Code not present" 
} 

あなたはTCLの正規表現では「使用、[使用することが従うべきコマンド/キーワードは意味

+0

こんにちはBordoloi、この解決策は動作しません。実際に式を評価し、正規表現 – Ashwin

+0

の中の値をtclバージョンu rに置き換えますか? –

+0

Tcl 8.5.7 – Ashwin

-1
SBORDOLO-M-V1VG:Downloads sbordolo$ cat t3 

set var1 "value" 
set currVal "var1" 
#set myFileContent "\[info exists var1\]" 
set myFileContent {[info exists var1]} 

if { ![regexp "[info exists $currVal]" $myFileContent] } { 
    puts "Code not present" 
} else { 
    puts "Code present" 
} 
SBORDOLO-M-V1VG:Downloads sbordolo$ 
SBORDOLO-M-V1VG:Downloads sbordolo$ tclsh t3 
Code present 
SBORDOLO-M-V1VG:Downloads sbordolo$ 
+0

であることを確認してください。あなたのコードは偶然によって動作します。パターン文字列は1と評価されるため、1文字以上の文字列に一致します。なぜ、 "info exists $ currVal"というパターンを使わないのですか? –

+0

puts $ myFileContentを追加してください。それはまだ評価されたものではなく文字列を出力しています。私が{}ではないことに注意してください。 " –

+0

私は*パターン*、つまり[info exists $ currVal]" 'について話しています。 'regexp'コマンドが呼び出されると、1と評価されます。つまり、実際のコマンドラインは' regexp 1 [info exists var1] 'です。 –

関連する問題