[TCL] 소스(source) 파일에 행번호 달기

TCL/C-Shell/Scripts 2009.08.19 15:46
  • 안녕하세요? 나도 디지털 영화 판매자 <쿨잼> 입니다.
    이제 블로그에서도 위젯 및 링크 등을 통해 합법 다운로드 영화를 판매하실 수 있습니다.

    블로그 방문자 수도 올리고, 판매를 통한 수익창출도 해보시는건 어떠세요?

    현재 아이팟 터치 지급 이벤트도 진행중이랍니다.

    http://www.cooljam.co.kr

    cooljam 2009.08.19 16:06 신고
    • 광고성 댓글은 환영하지 않지만, 스팸 댓글은 아닌 것 같아 일단 그냥 둡니다.

      youngjr 2009.08.20 10:18 신고 DEL
스크립트 관련 글을 올리다 보니, 소스 설명을 위해 행번호를 달 필요가 생겼네요.
그래서, 소스(텍스트 파일)에 행번호를 달아주는 TCL 스크립트를 만들어 보았습니다.

1: #!/bin/sh
2: # \
3: exec tclsh "$0" "$@"
4:
5: if {$argc > 0} {
6:    set input_fn [lindex $argv 0]
7: } else {
8:    exit
9: }
10: set line 1
11: set input_fid [open $input_fn RDONLY]
12: set eof_flag [eof $input_fid]
13: while {!$eof_flag} {
14:    set buffer [gets $input_fid]
15:    set eof_flag [eof $input_fid]
16:    if {!$eof_flag} {
17:       puts "${line}: $buffer"
18:       incr line
19:    }
20: }
21: close $input_fid

1-3번째 줄은 TCL 스크립트를 실행하기 위한 번역기(interpretor)를 설정하는 부분입니다.
보통 sh 은 /bin에 있지만, tclsh은 임의의 디렉토리에 설치되기도 하기 때문에, tclsh의 경로를 절대 경로로 정해주는 것보다는, 이 방법이 유연한 것 같습니다.
5-9번째 줄에서 입력된 argument개수에 의해 필요한 값을 받아옵니다. 입력된 argument가 1개 이상이면, 첫번째 argument를 입력 파일 이름으로 해 줍니다.
TCL에서는 실행하는 파일 자체의 이름은 argv0 이라는 별도의 변수로 들어갑니다. (C 같은 언어에서는 argv[0] 이지요.) 나머지 argument들은 argv라는 list에 들어있기 때문에 lindex 명령을 이용하여, 0번, 1번, 2번 차례로 argument를 지정할 수 있습니다.

11번째 줄에서 파일을 텍스트 읽기전용으로 열어줍니다.
12번째 줄에서는 파일의 끝인지 검사하는 변수를 플래그로 설정했습니다.
13번째 줄의 while 루프에서 파일의 끝이 아니면 반복하도록 합니다.
14번째 줄에서 buffer라는 변수에 파일의 한 줄을 읽어옵니다.
16-19번째 줄에서 파일의 끝이 아니면, 행번호와 읽어온 내용을 출력하고, 행번호를 하나 증가시킵니다.
21번째 줄에서 열려진 파일을 닫아줍니다.

간단한 스크립트이지만, 기본적으로 텍스트 파일을 읽어서 어떤 처리를 하는 자주 사용되는 TCL 스크립트의 전형이라 할 수 있겠습니다.
파일 열기 전에 파일이 실제로 존재하는 지 확인한다든지 하는 부분이 빠져있네요. 이런 사소한 듯하지만, 사용자의 부주의로 인한 실수를 막아주는 것은 스크립트나 프로그램의 질을 높여주는 요소이지요.
다음 글에는 이러한 점을 보완하고, 여러가지 argument를 받는 보다 완성도 있는 구조를 소개드리겠습니다.

신고
posted by youngjr