foreach — 리스트 요소 순회

foreach — 리스트 요소 순회

리스트의 각 요소를 하나씩 꺼내 같은 작업을 반복하고 싶을 때, foreach가 가장 자연스러운 선택이에요. 하나의 리스트뿐 아니라 여러 리스트를 병렬로 돌리거나, 한 리스트 요소를 여러 변수에 나눠 받는 것도 가능해요.

출처: Tcl Built-In Commands — foreach

본문

시그니처

foreach varname list body
foreach varlist1 list1 ?varlist2 list2 ...? body

foreach는 루프 변수(들)가 하나 이상의 리스트에서 값을 받아가며 도는 루프예요.

가장 단순한 경우는 루프 변수 varname 하나와 값의 리스트 list 하나가 있는 형태예요. body는 Tcl 스크립트고, list의 각 요소를 처음부터 끝까지 순서대로 varname에 할당한 뒤 body를 실행해요(요소 추출은 lindex 명령어로 한 것과 같아요).

일반적인 경우에는 값 리스트가 여러 개(list1, list2 등)일 수 있고, 각 값 리스트에 루프 변수 리스트(varlist1, varlist2 등)가 연결돼요. 매 반복마다 각 varlist의 변수들이 대응하는 리스트에서 연속된 값을 받아요. 각 리스트의 값은 처음부터 끝까지 순서대로 사용되고 각 값은 정확히 한 번만 쓰여요. 총 반복 횟수는 모든 값 리스트의 값을 다 쓰기에 충분한 만큼이에요. 어떤 값 리스트가 매 반복의 루프 변수 개수보다 적은 요소를 가졌다면, 부족한 부분은 빈 값으로 채워져요.

body 안에서 breakcontinue를 쓸 수 있고, 효과는 for 명령어와 같아요. foreach는 항상 빈 문자열을 반환해요.

예제

리스트의 각 값과 그 값의 제곱·세제곱을 함께 출력해요:

set values {1 3 5 7 2 4 6 8}	;# Odd numbers first, for fun!
puts "Value\tSquare\tCube"	;# Neat-looking header
foreach x $values {	;# Now loop and print...
    puts " $x\t [expr {$x**2}]\t [expr {$x**3}]"
}

ij 두 변수로 한 리스트의 요소 쌍을 순회해요:

set x {}
foreach {i j} {a b c d e f} {
    lappend x $j $i
}
# The value of x is "b a d c f e"
# There are 3 iterations of the loop.

ij로 두 리스트를 병렬 순회해요:

set x {}
foreach i {a b c} j {d e f g} {
    lappend x $i $j
}
# The value of x is "a d b e c f {} g"
# There are 4 iterations of the loop.

두 형태를 조합한 예시예요. jk가 두 번째 리스트에서 값을 나눠 받아요:

set x {}
foreach i {a b c} {j k} {d e f g} {
    lappend x $i $j $k
}
# The value of x is "a d e b f g c {} {}"
# There are 3 iterations of the loop.

더 알아보기