2017-03-09 5 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

참고 :'var1' 대신 정규식에서'$ currVal' 변수를 직접 사용하려고합니다. – 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]'임을 의미합니다. –