본문 바로가기

Linux/tcl

[Tcl] tcl 제어구조

  • 제어구조

- if then else 구문

set x 0
if { $x == 0 } {
	puts "Zero Value"
    } else {
    	puts "Nonzero Value"
    }
set x 0
if { $x == 0 } \
{
	puts "Zero Value"
} \
else \
{
    	puts "Nonzero Value"
}
// \를 이용해 if body가 여러 줄에 걸쳐 있음을 알려줌
set x 2 ; set y 6

if { $x != 0 && [expr $y / $x ] <4 } \
{
	puts "good"
} \
else \
{
	puts "bad"
}

result : good

// &&, || 의 경우 왼쪽의 수식 연산이 우선 실행 되므로 왼쪽이 거짓일 경우 오른쪽은 실행하지 않음
|| 의 경우 보다 간단한 연산을 왼쪽에 두고 실행하는 것이 좋다.

 

- switch 구문

ex)
set apple_price 100

switch #option# apple #value(바뀔 수 있는 값)# {
	apple { puts $apple_price }
    banana { puts $banana_price }
    default { puts "nothing" }
}

option : 
-exact : value의 값은 정확히 패턴과 일치해야함. 따로 지정하지 않으면 이 옵션은 지정되어 있는 것으로 간주
-glob : glob style 패턴 매칭을 사용
//////////////////////////////////////////////////////////////////////////////////////////////
glob? = string match 명령어에서 사용되는 패턴 UNIX shell에서 사용하는 wildcard 문자들을 사용하여
기술한 패턴을 말한다.
ex) wlid card
* : 아무 글자에나 매칭이 되고 0개 이상의 글자에 매칭
? : 아무 글자나 한 글자에만 매칭
[]: [ ] 사이에 열거된문자에만 매칭, 한 글자만 적용
/////////////////////////////////////////////////////////////////////////////////////////////
-regexp : 정규 표현식을 이용한 패턴 매칭
-- : 옵션의 끝을 나타냄 value값이 --로 시작하는 경우 옵션으로 오인하지 않기 위해 필요

 

- while 구문

ex)
set i 0
while { $i < 10 } {
	incr i
    puts $i
}

while { 1 } {
	puts "this is infinite loop
}

// 1은 참, 0은 거짓이므로 위의 문장이 무한하게 출력됨

 

- for 구문

ex) i가 10보다 작으면 1씩 증가시키고 10이 되면 종료
for { set i 0 } { $i < 10 } { incr k 1 } {
	puts $i
}

 

- foreach 구문

//valuelist가 가지고 있는 모든 리스트 원소들을 하나씩 차례로 loop에 할당하면서 body를 수행//

set var [ list 1 2 3 4 ]
foreach element $var {
	puts $element
}

//valuelist 쌍이 여러 개 올 수 있다//

foreach e1 { one two three } e2 { 1 2 3 } {
	puts "$e1 $e2"
}
result :
one 1
two 2
three 3

// complicated model //

foreach name { apple orange } { price1 pirce2 } { one 100 two 200 } {
	puts "$name = $price1 : $price2"
}

 

- break, continue 구문

ex) j가 2보다 커지면 break되서 루프를 나오고 i루프를 실행하고 다시 j루프에서 2보다 커지면 break
for { set i 0 } { $i < 3 } { incr i 1 } {
	puts "i = $i"
    for { set j 0 } { $j < 5 } { incr j 1 } {
    	if { $j > 2 } {
        	break
        }
        puts "j = $j"
     }
}
result :
i = 1
j = 1
j = 2
i = 2
j = 1 
j = 2

ex) continue 이하 명령어를 실행하지 않고 새로운 loop를 시작한다. 
    i가 3이 됬을 때 continue에 의해 바로 for loop가 진행되어 i = 4로 진행됨
for { set i 1 } { $i < 5 } { incr k } {
	if { $i == 3 } { 
    	continue
    }
    set ans [ expr 8 / $i ]
    puts $ans
}
result : 
8
4
2

 

- return 구문

함수를 종료하고 함수를 호출한 바로 다음 줄로 복귀

for { set i 0 } { $i < 10 } { incr k } {
     if { $i > 5 } {
         return
        }
     puts $i
    }

result :
0
1
2
3
4
5

 

- catch 구문 ??

 

- error 구문 ??

 

연습문제 1.

// 구구단을 출력하는 프로그램을 작성 하시오.
gets stdin Number1
gets stdin Number2
puts "${Number1} * ${Number2} = [ expr ${Number1} * ${Number2} ]"

// 1~60 의 임의의 숫자를 고르는 게임을 작성
고른 숫자가 크면 크다는 / 작으면 작다는 메세지 출력
맞췄을 경우 축하와 점수 출력 [ 점수는 반복 횟수가 적을수록 높게 ] 
임의의 숫자 >> UNIX commend : date | cut -c25-26

set random [ exec date | cut -c25-25 ]
set score 100
gets stdin number
for { set i 0 } { $i < 60 } { incr i } {
  if { $number == $random } {
      puts "Congratulation"
      puts "score : $score"
     } elseif { $number > $random } {
      puts "Number Down"
      set score [ expr $score -1 ]
     } elseif { $number < $random } {
      puts "Number Up"
      set score [ expr $score -1 ]
     }
     gets stdin number
}

 

 

'Linux > tcl' 카테고리의 다른 글

[tcl]  (0) 2022.08.02
[Tcl] tcl 정규표현식  (0) 2022.06.10
[Tcl] tcl 리스트 / 배열  (0) 2022.05.25
[Tcl] tcl 문자열 조작  (0) 2022.05.18
[Tcl] tcl 기본문법  (0) 2022.05.17