lreplace — 리스트의 원소 새 원소로 바꾸기
lreplace — 리스트의 원소 새 원소로 바꾸기
리스트의 일정 범위를 다른 원소들로 바꾸고 싶을 때 쓰는 명령어가 lreplace예요. 바꿀 범위의 시작·끝 인덱스를 주고, 대신 넣을 원소들을 지정해요. 원소를 하나도 주지 않으면 그 구간을 그냥 삭제하는 셈이 되고, 범위를 리스트 길이 밖으로 잡으면 앞에 붙이거나 뒤에 추가하는 것도 가능해요.
출처: 문서
본문
lreplace는 list의 0개 이상의 원소를 element 인수들로 바꿔 만든 새 리스트를 반환해요. first와 last는 바꿀 범위의 처음과 마지막 원소를 지정하는 인덱스 값이에요. 인덱스 값 first와 last는 string index 명령어의 인덱스 값과 똑같이 해석되어, 단순 인덱스 산술과 리스트 끝을 기준으로 한 인덱스를 지원해요. 0은 리스트의 첫 번째 원소를, end는 리스트의 마지막 원소를 가리켜요.
first나 last가 0보다 작으면, 리스트의 첫 번째 원소 이전을 가리키는 것으로 간주돼요. 그래서 lreplace로 리스트 앞에 원소를 추가할 수 있어요. first나 last가 리스트의 마지막 원소 인덱스보다 큰 위치를 가리키면, 마지막 원소보다 1 큰 인덱스인 것처럼 처리돼요. 그래서 lreplace로 리스트 끝에 원소를 추가할 수 있어요.
last가 first보다 작으면, 지정된 원소들이 삭제 없이 first가 지정한 원소 앞에 삽입돼요.
element 인수들은 삭제된 원소들을 대신해 리스트에 추가될 0개 이상의 새 원소를 지정해요. 각 element 인수는 리스트의 별개 원소가 돼요. element 인수가 지정되지 않으면 first와 last 사이의 원소들이 그냥 삭제돼요.
구문은 다음과 같아요.
lreplace list first last ?element element ...?
예시
리스트의 한 원소를 다른 것으로 바꾸기:
% lreplace {a b c d e} 1 1 foo
a foo c d e
리스트의 두 원소를 세 개로 바꾸기:
% lreplace {a b c d e} 1 2 three more elements
a three more elements d e
변수 안의 리스트에서 마지막 원소 삭제하기:
% set var {a b c d e}
a b c d e
% set var [lreplace $var end end]
a b c d
리스트에서 주어진 원소를 지우는 프로시저:
proc lremove {listVariable value} {
upvar 1 $listVariable var
set idx [lsearch -exact $var $value]
set var [lreplace $var $idx $idx]
}
리스트에 원소 추가하기. 여기서 end+2는 처음에 6으로 처리되지만, 그것과 12345 모두 마지막 항목의 인덱스보다 크므로 똑같이 동작해요.
% set var {a b c d e}
a b c d e
% set var [lreplace $var 12345 end+2 f g h i]
a b c d e f g h i
더 알아보기
list,lappend,lindex,linsert,llength,lsearch,lset,lrange,lsort,string