Tcl의 배열

admin의 아바타

Tcl은 문자열을 첨자로 하는 연상 배열을 사용할 수 있습니다. 배열의 첨자는 괄호안에 임의의 문자열을 지정합니다. 개별적인 배열 요소의 값은 $로 직접 참조할 수 있습니다. 또한 parray 커맨드를 사용하여 모든 배열 요소의 값을 표시할 수 있습니다.

set ary(이름) 민인학
set ary(성별)
set ary(연령) 31
puts "$ary(이름) $ary(성별) $ary(연령)"
=> 민인학 남 31

parray ary
=> ary(이름) = 민인학
=> ary(연령) = 31
=> ary(성별) = 남

배열명과 첨자는 변수값과 커맨드의 결과를 사용할 수 있습니다. 단, 배열명에 변수값을 사용한 경우는, 중 괄호 ( {..} )를 사용해야 합니다.

set name ary
set ${name}(이름) 민인학
set ${name}(이름)
=> 민인학
set x ${name}(이름)
=> ary(이름)
set x [set ${name}(이름)]
=> 민인학

set index 이름
set ary($index) 민인학
set ary($index)
=> 민인학
set x $ary($index)
=> 민인학

아래는 배열명의 첨자에 변수값을 사용한 예입니다. for로 루프를 돌며 배열을 생성합니다.

for {set index 0} {$index < 5} {incr index} {
    set ary($index) $index
}
parray ary
=> ary(0) = 0
=> ary(1) = 1
=> ary(2) = 2
=> ary(3) = 3
=> ary(4) = 4

array 커맨드

array 커맨드는 배열을 조작하기 위한 커맨드 입니다. array set 커맨드를 사용하면 리스트로부터 배열을 생성할 수 있습니다.

array set ary {
    이름 민인학
    성별 남
    연령 31
}

parray ary
=> ary(이름) = 민인학
=> ary(연령) = 31
=> ary(성별) = 남

array 커맨드는 아래의 옵션을 지원합니다.

array exists arrayName arrayName이라는 배열이 존재하면 1을 리턴. 그렇지 않으면 0을 리턴.
array get arrayName ? pattern? 패턴에 매치되는 첨자의 요소를 리스트로 리턴한다. 패턴을 생략한 경우는, 모든 요소의 리스트를 리턴한다. 패턴은 glob형식을 사용한다.
array names arrayName ? pattern? 패턴에 매치되는 첨자를 리턴한다. 패턴을 생략한 경우는 모든 첨자를 리턴한다.
array set arrayName list 리스트로부터 배열을 생성한다.
array size arrayName 배열의 요소갯수를 리턴한다.
array unset arrayName ? pattern? 패턴에 매치되는 첨자의 요소를 삭제한다. 패턴을 생략한 경우는 배열을 삭제한다.

배열을 리스트로 변환하는 예입니다.

array set ary {
    이름 민인학
    성별 남
    연령 31
}
array get ary
=> 이름 민인학 연령 31세 성별 남

배열의 첨자를 리스트로 변환하는 예입니다.

array set ary {
    이름 민인학
    성별 남
    연령 31
}
array names ary
 => 이름 연령 성별

배열을 복사하는 예입니다.

array set ary {
    이름 민인학
    성별 남
    연령 31
}

# 배열을 복사하는 프로시져
proc copy {ary1 ary2} {
    upvar $ary1 from $ary2 to
    foreach {index value} [array get from *] {
        set to($index) $value
    }
}

# 복사
copy ary foo

# 결과
parray foo
=> foo(이름) = 민인학
=> foo(연령) = 31
=> foo(성별) = 남

2차원 배열

Tcl의 연상 배열은 1차원 배열이지만, 첨자가 문자열인것을 이용하여 아래와 같이 10x10의 2차원 배열과 같은 것도 표현 가능합니다.

for {set i 0} {$i < 10} {incr i} {
   for {set j 0} {$j < 10} {incr j} {
        set ary($i,$j) "$i,$j"
   }
}
parray ary
ary(0,0) = 0,0
ary(0,1) = 0,1
ary(0,2) = 0,2
...생략...
ary(9,7) = 9,7
ary(9,8) = 9,8
ary(9,9) = 9,9