array — 배열 변수 다루기

array — 배열 변수 다루기

Tcl의 배열은 이름→값 매핑을 담는 해시 구조예요. array 명령으로 배열의 존재 확인, 요소 나열, 검색, 통계, 삭제 같은 여러 작업을 수행할 수 있습니다.

출처: array manual page

본문

array option arrayName ?arg arg ...?

이 명령은 arrayName으로 주어진 변수에 여러 작업 중 하나를 수행합니다. 아래 각 명령에 별도로 명시하지 않는 한 arrayName은 기존 배열 변수의 이름이어야 해요. option 인자가 명령이 수행할 동작을 결정합니다. 합법적인 option(축약 가능)들은 다음과 같습니다.

array anymore arrayName searchId

배열 검색에서 처리할 요소가 아직 남아 있으면 1, 모든 요소가 이미 리턴됐으면 0을 리턴합니다. searchIdarrayName의 어떤 검색인지 나타내며, 이전 array startsearch 호출의 리턴값이어야 해요. 빈 이름을 가진 요소가 있는 배열에서 특히 유용합니다. array nextelement의 리턴값은 검색이 끝났는지 알려 주지 않기 때문이죠.

array donesearch arrayName searchId

배열 검색을 종료하고 그 검색과 연관된 모든 상태를 파괴합니다. searchId는 이전 array startsearch 호출의 리턴값이어야 해요. 빈 문자열을 리턴합니다.

array exists arrayName

arrayName이 배열 변수면 1, 그 이름의 변수가 없거나 스칼라 변수면 0을 리턴합니다.

array get arrayName ?pattern?

요소 쌍들을 담은 목록을 리턴합니다. 각 쌍의 첫 요소는 arrayName의 요소 이름, 둘째 요소는 그 배열 요소의 값이에요. 쌍의 순서는 정의되어 있지 않습니다. pattern이 지정되지 않으면 배열의 모든 요소가 결과에 포함됩니다. pattern이 지정되면 이름이 pattern과 일치하는(string match의 매칭 규칙 사용) 요소만 포함돼요. arrayName이 배열 변수가 아니거나 배열에 요소가 없으면 빈 목록을 리턴합니다. 배열의 트레이스가 요소 목록을 수정하면, 리턴되는 요소는 array get 호출 전후에 모두 존재하는 것들이에요.

array names arrayName ?mode? ?pattern?

pattern과 일치하는 배열의 모든 요소 이름을 담은 목록을 리턴합니다. mode-exact, -glob, -regexp 중 하나예요. 지정하면 pattern을 배열 요소 이름에 대조하는 규칙을 정합니다. 지정하지 않으면 mode-glob으로 기본 설정됩니다. glob 스타일 매칭은 string match 문서를, regexp 매칭은 regexp 문서를 참조하세요. pattern이 생략되면 배열의 모든 요소 이름을 리턴합니다. (일치하는) 요소가 없거나 arrayName이 배열 변수가 아니면 빈 문자열을 리턴합니다.

array nextelement arrayName searchId

arrayName의 다음 요소 이름을 리턴하고, 이 검색에서 모든 요소가 이미 리턴됐으면 빈 문자열을 리턴합니다. searchId 인자는 검색을 식별하며 array startsearch 명령의 리턴값이어야 해요. 경고: 배열에 요소가 추가되거나 삭제되면 array donesearch가 호출된 것처럼 모든 검색이 자동으로 종료됩니다. 그러면 그 검색들의 array nextelement 작업이 실패하게 돼요.

array set arrayName list

arrayName의 하나 이상의 요소 값을 설정합니다. listarray get이 리턴하는 것과 같은 형태여야 하며, 짝수 개의 요소로 구성됩니다. list의 각 홀수 번째 요소는 arrayName 안의 요소 이름으로, 다음 요소는 그 배열 요소의 새 값으로 취급해요. 변수 arrayName이 아직 존재하지 않고 list가 비어 있으면 arrayName이 빈 배열 값으로 생성됩니다.

array size arrayName

배열의 요소 수를 십진 문자열로 리턴합니다. arrayName이 배열 이름이 아니면 0을 리턴해요.

array startsearch arrayName

arrayName으로 주어진 배열에 대한 요소별 검색을 초기화해서, array nextelement 명령 호출이 배열의 개별 요소 이름을 리턴하게 합니다. 검색이 완료되면 array donesearch 명령을 호출해야 합니다. 리턴값은 array nextelementarray donesearch 명령에 써야 하는 검색 식별자예요. 이를 통해 같은 배열에 대해 여러 검색을 동시에 진행할 수 있습니다. 아주 큰 배열이 아니라면 array get이나 array namesforeach와 함께 써서 반복하는 것이 현재 더 효율적이고 사용하기 쉽습니다. 방법은 아래 예시를 참고하세요.

array statistics arrayName

배열을 나타내는 해시테이블 내 데이터 분포에 대한 통계를 리턴합니다. 여기에는 테이블의 항목 수, 버킷 수, 버킷 활용률이 포함됩니다.

array unset arrayName ?pattern?

pattern과 일치하는(string match 매칭 규칙 사용) 배열의 모든 요소를 설정 해제(unset)합니다. arrayName이 배열 변수가 아니거나 일치하는 요소가 없어도 오류는 발생하지 않아요. pattern이 생략되고 arrayName이 배열 변수면 배열 전체를 unset합니다. 이 명령은 항상 빈 문자열을 리턴합니다.

예시

array set colorcount {
    red   1
    green 5
    blue  4
    white 9
}

foreach {color count} [array get colorcount] {
    puts "Color: $color Count: $count"
}
  → Color: blue Count: 4
    Color: white Count: 9
    Color: green Count: 5
    Color: red Count: 1

foreach color [array names colorcount] {
    puts "Color: $color Count: $colorcount($color)"
}
  → Color: blue Count: 4
    Color: white Count: 9
    Color: green Count: 5
    Color: red Count: 1

foreach color [lsort [array names colorcount]] {
    puts "Color: $color Count: $colorcount($color)"
}
  → Color: blue Count: 4
    Color: green Count: 5
    Color: red Count: 1
    Color: white Count: 9

array statistics colorcount
  → 4 entries in table, 4 buckets
    number of buckets with 0 entries: 1
    number of buckets with 1 entries: 2
    number of buckets with 2 entries: 1
    number of buckets with 3 entries: 0
    number of buckets with 4 entries: 0
    number of buckets with 5 entries: 0
    number of buckets with 6 entries: 0
    number of buckets with 7 entries: 0
    number of buckets with 8 entries: 0
    number of buckets with 9 entries: 0
    number of buckets with 10 or more entries: 0
    average search distance for entry: 1.2

더 알아보기

  • list, string, variable, trace, foreach — 배열과 함께 쓰는 명령
  • 키워드: array, element names, search