2012-07-05 6 views
0

regexp 함수를 통해 한 행의 데이터를 다른 변수에 일치시키려는 다음 코드가 있습니다. 데이터의 수 (입력 행의)와 변수 이름이 인 regexp 기능이 다를 수 있으므로 그 이유는 이전에 내 실제 코드에서 처리 된 $ varLine을 사용하기 때문입니다. 내가 그것을 실행하고 때TCL, regexp 함수 및 매개 변수 대체

set in_stim "13 1 1 0 1 0 0 0 2 03" 
set regex {^(\d+)\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s(\d+)\s(\d+)} 
set varLine "sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8" 
regexp $regex $in_stim whole sig0 $varLine 
puts "sig0: $sig0" 
puts $sig1 

, 나는 다음과 같은 오류가 ($ sig0가 올바르게 표시됩니다) :

sig0: 13 

    can't read "sig1": no such variable 
    while executing 
"puts $sig1" 

내가 수동으로 정규 표현식 라인에 $ varLine를 대체 할 경우, 오류가 사라 :

set in_stim "13 1 1 0 1 0 0 0 2 03" 
set regex {^(\d+)\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s(\d+)\s(\d+)} 
regexp $regex $in_stim whole sig0 sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8 
puts $sig0 
puts $sig1 

나는 다음과 같은 올바른 출력을 얻을 :

13 
1 

누구든지 내 코드에서 실수를 보거나 도움이 될 수 있습니까? 감사합니다.

답변

2

문제는 regexp 명령이 서브 쿼리를 하나의 인수로 저장하는 대신 여러 개의 인수로 저장하는 변수 목록을 사용하지 않는다는 것입니다.

regexp $regex $in_stim whole sig0 {*}$varLine 
2

당신은 Tcl의 파서가 다음 하나의 단어로 regexp 명령에 의해 처리 변수 "varLine"의 내용 인 다섯 번째 인수로, 정확히 5 개 인수 regexp 명령을 전달

set varLine "sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8" 
regexp $regex $in_stim whole sig0 $varLine 

작업을 수행 할 때 . 단일 단어는 분명히 단일 변수를 나타냅니다 (실제로 발생하는 경우 복잡한 이름을 사용합니다).

  1. "클래식"접근 방식은 eval를 사용하여 :

    는 당신이 필요로하는 일을하려면 두 가지 방법으로 수행 할 수 있습니다 동적 스크립트에 의존해야

    eval [concat [list regexp $regex $in_stim whole sig0] $varLine] 
    
  2. {*} 사용 Tcl 8.5 이후의 문법적 설탕 :

    regexp $regex $in_stim whole sig0 {*}$varLine 
    

고전적인 방법은 먼저 명령의 "정적"부분과 전달할 변수 목록을 연결하여 단어 목록을 만듭니다. 그런 다음 구성된 목록은 eval이고 명령으로 사용됩니다. this classic book에서 자세한 내용을 확인할 수 있습니다.

새 스타일 방식에서는 $ varLine의 내용을 "내부"목록으로 확장하기 위해 {*}을 사용합니다 — here을 참조하십시오.

+0

문제 해결 :

이 주변 작업의 가장 간단한 방법은 변수리스트를 확장하는 것이다! 감사합니다 kostix! 'eval' 명령을 처리해야 겠지만 목록 팁을 잊어 버렸습니다.그리고 나는 {*}에 대해 읽었지만 이해하지 못했습니다. 당신의 링크는 완벽했습니다! – feronjb