lreplace — 리스트의 원소 새 원소로 바꾸기

lreplace — 리스트의 원소 새 원소로 바꾸기

리스트의 일정 범위를 다른 원소들로 바꾸고 싶을 때 쓰는 명령어가 lreplace예요. 바꿀 범위의 시작·끝 인덱스를 주고, 대신 넣을 원소들을 지정해요. 원소를 하나도 주지 않으면 그 구간을 그냥 삭제하는 셈이 되고, 범위를 리스트 길이 밖으로 잡으면 앞에 붙이거나 뒤에 추가하는 것도 가능해요.

출처: 문서

본문

lreplacelist의 0개 이상의 원소를 element 인수들로 바꿔 만든 새 리스트를 반환해요. firstlast는 바꿀 범위의 처음과 마지막 원소를 지정하는 인덱스 값이에요. 인덱스 값 firstlaststring index 명령어의 인덱스 값과 똑같이 해석되어, 단순 인덱스 산술과 리스트 끝을 기준으로 한 인덱스를 지원해요. 0은 리스트의 첫 번째 원소를, end는 리스트의 마지막 원소를 가리켜요.

firstlast가 0보다 작으면, 리스트의 첫 번째 원소 이전을 가리키는 것으로 간주돼요. 그래서 lreplace로 리스트 앞에 원소를 추가할 수 있어요. firstlast가 리스트의 마지막 원소 인덱스보다 큰 위치를 가리키면, 마지막 원소보다 1 큰 인덱스인 것처럼 처리돼요. 그래서 lreplace로 리스트 끝에 원소를 추가할 수 있어요.

lastfirst보다 작으면, 지정된 원소들이 삭제 없이 first가 지정한 원소 앞에 삽입돼요.

element 인수들은 삭제된 원소들을 대신해 리스트에 추가될 0개 이상의 새 원소를 지정해요. 각 element 인수는 리스트의 별개 원소가 돼요. element 인수가 지정되지 않으면 firstlast 사이의 원소들이 그냥 삭제돼요.

구문은 다음과 같아요.

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