2017-12-14 16 views
0

배열이 존재하는지, 배열 이름이 변수에 있는지 확인할 수 없습니다. 내 경우 배열 이름에 공백도 들어있다.TCL : 배열 이름이 변수 일 경우 어떻게 배열 정보를 확인할 수 있습니까

code snippet: 
array set a\ b{ 
    key1 "val1" 
} 

proc checkArr {name} 
{ 
    if {![info exists $name($key)]} { 
     return {} 
    } 
} 

checkArr "a b" 

오류 : 는 "이름 (키 1)"을 읽을 수 없습니다 : 변수가

사람이 도와 드릴까요 배열하지?

+0

샘플 당신이 주장하는 문제 이외의 문제를 가지고있다. 재현 할 수있는 코드 스 니펫을 제공하십시오. – Jerry

+0

@Jerry에게 문의 해 주셔서 감사합니다. 배열 이름이 변수이고 공백이 있으면 정보가 존재하면 도움이 필요합니다. 친절하게 도와주세요 – Stuti

+0

복제 : https://stackoverflow.com/questions/44605149/tcl-how-to-name-a-variable-that-includes-another-variable?rq=1 et. al. –

답변

2

코드의 주요 문제는 전역 범위에있는 배열이 로컬 범위에 있는지 확인하려는 것입니다.

array set a\ b { 
    key1 "val1" 
} 

proc checkArr {name} { 
    upvar $name arr 
    if {![info exists arr(key1)]} { 
    return 0 
    } else { 
    return 1 
    } 
} 

proc 디렉토리의 로컬 범위 내에서 액세스 할 수있는 배열을 갖기 위해, 사용할 수있는 하나 global $name 또는 upvar $name arr (I 위의 후자 사용됨) info exist 일부를 실행할 때, 또는 uplevel를 사용할 수있다. 그렇지 않으면 당신은 arr(key1)$name($key)를 변경하는 기능

  • 에 하나의 매개 변수를 공급하고는 array set 부분

    • 추가 공간 :

      일부 다른 조정 내가 코드를 실시. 당신이 $name($key)를 사용하는 경우, 그것은 $name($key)의 값이 '값'인 경우 (즉, 변수의 값에 대한 변수 이름을 찾으려고 있도록 info exists 변수가 value 존재라는 이름의 여부를 확인하려고합니다 info exists, 변수 이름을 사용합니다, 배열 값 $name($key)이 존재하지 않으므로 오류가 발생합니다.

      proc checkArr name { 
          uplevel #0 [list info exists $name] 
      } 
      
      % checkArr "a b" 
      0 
      

      인수로 "a b"을 주어이 명령은 스크립트 info exists {a b}를 실행하지만 명령 내부의 지역 수준에서 :

  • +2

    'if ... return ... else return ...'더 읽기 쉬울 수도 있습니다 :'return [info exists arr (key1)]' –

    +0

    예, 저는'if ... else .. .' 가능성이있는 형식의 형식 OP 나중에 해당 구조를 사용하여 다른 뭔가를 반환합니다. 그 모습에서 그들은 Q 형식에 적합한 것을 보여줘야 만하는 원래 코드의 상당 부분을 제거했지만 그 과정에서 오류가 발생했습니다. – Jerry

    0

    의 글로벌 배열의 존재를 확인하는 명령을 만들어 보자 : uplevel #0 부분은 스크립트가 전역 수준에서 실행됨을 의미합니다.

    이제 우리는 배열을 만들고, 그것을 확인 : 그것은 존재

    % array set a\ b {key1 val1} 
    % checkArr "a b" 
    1 
    

    합니다. 우리는 또한 동일한 코드를 사용하여 배열의 구성원의 존재를 확인할 수 있습니다

    % checkArr "a b(key1)" 
    1 
    

    사실, 문자열 어떤 종류의 checkArr에 전달 될 수 있으며 변수가있는 경우 (배열을 알려하거나 것입니다) 그 이름으로. 당신이 배열 구성원에 대한 전문 검사를 원하는 경우, 다음과 같이 쓸 수있다 :

    proc checkArrayMember {arrName memberName} { 
        uplevel #0 [list info exists $arrName\($memberName)] 
    } 
    
    % checkArrayMember "a b" key1 
    1 
    

    왼쪽 괄호 앞의 백 슬래시는 문자열의 단지 일부의 통 사적 의미를 없애하고 있습니다 : 기본적으로 스크립트를 info exists {a b(key1)}이됩니다.

    문서 : 사용자가 제공 array, info, list, proc, uplevel, Summary of Tcl language syntax