lsearch — 리스트가 특정 원소를 담고 있는지 찾기
lsearch — 리스트가 특정 원소를 담고 있는지 찾기
리스트 안에서 특정 원소를 찾고 싶을 때 쓰는 명령어가 lsearch예요. 기본적으로는 pattern과 일치하는 첫 번째 원소의 인덱스를 돌려주고, 없으면 -1을 돌려줘요. 일치 방식을 -exact, -glob, -regexp처럼 골라 쓸 수 있고, -all·-inline 같은 옵션으로 모든 일치 결과를 모으거나 값을 직접 받을 수도 있어요.
출처: 문서
본문
lsearch 명령어는 list의 원소들 중 하나가 pattern과 일치하는지 검색해요. 일치하면 첫 번째 일치 원소의 인덱스를 반환하고(-all이나 -inline 옵션이 지정된 경우는 제외), 일치하지 않으면 -1을(또는 -all·-inline 옵션이 지정된 경우 빈 문자열을) 반환해요. 옵션 인수는 리스트의 원소를 pattern과 어떻게 대조할지를 나타내며, 아래 값 중 하나여야 해요.
구문은 다음과 같아요.
lsearch ?options? list pattern
일치 방식 옵션
일치 방식 옵션을 모두 생략하면 기본 일치 방식은 -glob이에요. 일치 방식을 둘 이상 지정하면 마지막에 지정한 방식이 우선해요.
-exact — pattern은 리터럴 문자열로, 각 리스트 원소와 완전히 같은지 비교돼요.
-glob — pattern은 glob 스타일 패턴으로, string match 명령어와 같은 규칙으로 각 원소와 대조돼요.
-regexp — pattern은 정규 표현식으로 취급되어 re_syntax 참조 페이지의 규칙에 따라 각 원소와 대조돼요.
-sorted — 리스트 원소들이 정렬된 상태라고 가정해요. 이 옵션을 지정하면 lsearch는 더 효율적인 검색 알고리즘을 써요. 다른 옵션을 지정하지 않으면 리스트는 오름차순이며 ASCII 문자열을 담고 있다고 가정해요. 이 옵션은 -glob·-regexp와 상호 배타적이고, -all이나 -not이 지정되면 -exact처럼 정확히 처리돼요.
일반 수식 옵션
이 옵션들은 모든 일치 방식과 함께 쓸 수 있어요.
-all — 결과가 모든 일치 인덱스의 리스트로 바뀌어요(-inline도 함께 지정하면 모든 일치 값의 리스트). 인덱스가 반환되면 오름차순 숫자 순서예요. 값이 반환되면 입력 리스트 안에서의 순서를 따라요.
-inline — 인덱스 대신 일치 값을 반환해요(일치하는 값이 없으면 빈 문자열). -all도 지정하면 모든 일치 값의 리스트가 결과예요.
-not — 일치의 의미를 뒤집어, 리스트에서 첫 번째로 일치하지 않는 값의 인덱스를 반환해요.
-start index — 검색을 index 위치에서 시작해요. 인덱스 값의 해석은 string index 명령어와 동일해서, 단순 인덱스 산술과 리스트 끝 기준 인덱스를 지원해요.
내용 설명 옵션
이 옵션들은 검색 대상 리스트의 항목을 어떻게 해석할지 설명해요. -exact·-sorted 옵션과 함께 쓸 때만 의미가 있어요. 둘 이상 지정하면 마지막 것이 우선하고, 기본은 -ascii예요.
-ascii — 리스트 원소를 유니코드 문자열로 검사해요(이름은 하위 호환성 때문이에요).
-dictionary — 리스트 원소를 사전식 비교로 대조해요(lsort에서 자세히 설명). 값이 정확히 같을 때만 사전식으로 같기 때문에, -sorted 옵션을 줄 때만 -ascii와 의미 있는 차이가 있어요.
-integer — 리스트 원소를 정수로 비교해요.
-nocase — 비교를 대소문자 구분 없이 처리해요. -dictionary·-integer·-real 옵션과 함께 쓰면 효과가 없어요.
-real — 리스트 원소를 부동소수점 값으로 비교해요.
정렬 리스트 옵션
이 옵션들(-sorted 옵션과 함께만 의미)은 리스트가 어떻게 정렬되었는지 지정해요. 둘 이상 주면 마지막 것이 우선하고 기본은 -increasing이에요.
-decreasing — 리스트 원소가 내림차순으로 정렬돼 있어요. -sorted와 함께 쓸 때만 의미가 있어요.
-increasing — 리스트 원소가 오름차순으로 정렬돼 있어요. -sorted와 함께 쓸 때만 의미가 있어요.
-bisect — 리스트 원소가 정렬된 상태일 때의 근사(inexact) 검색이에요. 오름차순 리스트에서는 원소가 pattern보다 작거나 같은 마지막 인덱스를 반환하고, 내림차순 리스트에서는 pattern보다 크거나 같은 마지막 인덱스를 반환해요. pattern이 첫 번째 원소보다 앞이거나 리스트가 비어 있으면 -1을 반환해요. 이 옵션은 -sorted를 내포하며 -all이나 -not과 함께 쓸 수 없어요.
중첩 리스트 옵션
이 옵션들은 리스트의 리스트를 검색할 때 사용해요. 다른 어떤 옵션과도 함께 쓸 수 있어요.
-index indexList — 중첩 리스트 안을 검색할 때 쓰도록 설계됐어요. indexList 인수는 각 원소 안에서 대조 대상을 찾을 위치를 나타내는 인덱스의 경로예요(lindex·lset 명령어에서 쓰는 방식과 비슷해요).
-subindices — 이 옵션을 주면, 이 명령어의 인덱스 결과(-all도 지정하면 모든 인덱스 결과)가 전체 리스트 안에서 찾은 항목까지의 완전한 경로(lindex·lset에 쓸 수 있는 형태)가 돼요. -index도 지정하지 않으면 효과가 없고, 그저 편의를 위한 단축키예요.
예시
기본 검색:
lsearch {a b c d e} c
→ 2
lsearch -all {a b c a b c} c
→ 2 5
lsearch로 리스트 걸러내기:
lsearch -inline {a20 b35 c47} b*
→ b35
lsearch -inline -not {a20 b35 c47} b*
→ a20
lsearch -all -inline -not {a20 b35 c47} b*
→ a20 c47
lsearch -all -not {a20 b35 c47} b*
→ 0 2
이것은 집합(set) 같은 제거 연산도 할 수 있어요:
lsearch -all -inline -not -exact {a b c a d e a f g a} a
→ b c d e f g
검색은 리스트 중간에서 시작할 수도 있어요:
lsearch -start 3 {a b c a b c} c
→ 5
원소 안을 검색하는 것도 가능해요:
lsearch -index 1 -all -inline {{abc abc} {abc bcd} {abc cde}} *bc*
→ {abc abc} {abc bcd}
더 알아보기
foreach,list,lappend,lindex,linsert,llength,lset,lsort,lrange,lreplace,string