lset — 리스트의 원소 바꾸기
lset — 리스트의 원소 바꾸기
리스트 변수 안의 특정 원소를 새 값으로 바꾸고 싶을 때 쓰는 명령어가 lset이에요. 인덱스를 여러 개 주면 중첩된 하위 리스트 안까지 들어가 원소를 바꿔요. 바뀐 새 리스트는 변수에 저장되고, 동시에 명령어의 반환값이 되기도 해요. 주의할 점은 인덱스를 리스트 범위 밖으로 주면 오류가 난다는 거예요.
출처: 문서
본문
lset 명령어는 varName을 인수로 받는데, 이를 Tcl 리스트를 담고 있는 변수의 이름으로 해석해요. 리스트에 대한 인덱스도 0개 이상 받아요. 인덱스는 명령줄에 연속해서 줄 수도 있고, Tcl 리스트로 묶어 하나의 인수로 줄 수도 있어요. 마지막으로 varName의 한 원소에 대한 새 값을 받아요.
인덱스가 주어지지 않으면 명령어는 다음과 같은 형태가 돼요.
lset varName newValue
또는
lset varName {} newValue
이 경우 newValue가 변수 varName의 기존 값을 대체해요.
인덱스가 하나 주어지면 lset 명령어는 varName 변수의 내용을 Tcl 리스트로 취급해서 그 안의 index 번째 원소를 지정해요(0은 리스트의 첫 번째 원소). 리스트를 해석할 때 lset은 중괄호·따옴표·백슬래시에 대해 Tcl 명령 인터프리터와 같은 규칙을 따르지만, 변수 치환과 명령 치환은 일어나지 않아요. 이 명령어는 지정된 원소가 newValue로 바뀐 새 리스트를 만들고, 이 새 리스트를 변수 varName에 저장해요. 이 값은 lset 명령어의 반환값이기도 해요.
index가 음수이거나 $varName의 원소 개수보다 크면 오류가 발생해요. index가 $varName의 원소 개수와 같으면 주어진 원소가 리스트에 추가돼요. 각 단순 인덱스 값의 해석은 string index 명령어와 동일해서, 단순 인덱스 산술과 리스트 끝 기준 인덱스를 지원해요.
인덱스 인수가 추가로 주어지면, 각 인수는 이전 인덱싱 연산이 지정한 하위 리스트 안의 원소를 차례대로 지정해요. 덕분에 스크립트가 하위 리스트의 원소를 바꾸거나(하위 리스트에 원소를 추가) 할 수 있어요. 다음 명령어
lset a 1 2 newValue
또는
lset a {1 2} newValue
는 하위 리스트 1의 2번 원소를 newValue로 바꿔요.
각 인덱스 인수에 나타나는 정수는 0보다 크거나 같아야 하고, 해당 리스트의 길이보다 작거나 같아야 해요. 다시 말해 lset 명령어는 리스트의 크기를 오직 원소를 추가하는 방식으로만(현재 끝 다음에 놓는 방식으로) 바꿀 수 있어요. 인덱스가 허용 범위를 벗어나면 오류가 보고돼요.
구문은 다음과 같아요.
lset varName ?index ...? newValue
예시
이 예시들 각각에서 x의 초기 값은 다음과 같아요.
set x [list [list a b c] [list d e f] [list g h i]]
→ {a b c} {d e f} {g h i}
표시된 반환값은 x의 새 값이 되기도 해요(마지막 경우는 오류라서 x의 값은 그대로예요).
lset x {j k l}
→ j k l
lset x {} {j k l}
→ j k l
lset x 0 j
→ j {d e f} {g h i}
lset x 2 j
→ {a b c} {d e f} j
lset x end j
→ {a b c} {d e f} j
lset x end-1 j
→ {a b c} j {g h i}
lset x 2 1 j
→ {a b c} {d e f} {g j i}
lset x {2 1} j
→ {a b c} {d e f} {g j i}
lset x {2 3} j
→ list index out of range
다음 예시들에서 x의 초기 값은 다음과 같아요.
set x [list [list [list a b] [list c d]] \
[list [list e f] [list g h]]]
→ {{a b} {c d}} {{e f} {g h}}
표시된 반환값도 x의 새 값이 돼요.
lset x 1 1 0 j
→ {{a b} {c d}} {{e f} {j h}}
lset x {1 1 0} j
→ {{a b} {c d}} {{e f} {j h}}
더 알아보기
list,lappend,lindex,linsert,llength,lsearch,lsort,lrange,lreplace,string