今回はFORTRANでtacコマンドを作ります。まずtacの動きを確認します。
takk@deb9:~$ cat x00 10 20 30 40 50 60 70 80 90 100 takk@deb9:~$ tac x00 100 90 80 70 60 50 40 30 20 10 takk@deb9:~$
上下逆にするだけですね。簡単ですね。いまどきのスクリプトならこんな感じで3行で書ける処理です。
takk@deb9:~$ cat tac.pl @lines = <>; @reverse_lines = reverse @lines; print"@reverse_lines"; takk@deb9:~$
takk@deb9:~$ perl tac.pl x00 100 90 80 70 60 50 40 30 20 10 takk@deb9:~$
FORTRAN77だとそう簡単にいかなさそうです。まあ学び始めたばかりなので。
まずは文字列を配列に格納する処理を作ります。
takk@deb9:~$ cat tac1.f PROGRAM cat CHARACTER*50 ARGS,LINE,LINES(100) INTEGER N,NUM NFLAG=0 N = IARGC() NUM=1 DO 11111 I=1,N CALL GETARG(I,ARGS) OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1), 1 STATUS='OLD', 2 ACCESS='SEQUENTIAL') 10 READ(10,*,END=100) LINE LINES(NUM) = LINE NUM=NUM+1 GOTO 10 100 CLOSE(10,STATUS='KEEP') 11111 CONTINUE STOP END takk@deb9:~$
実行はしてみますが、何の表示もしていないので、エラーが起きなかったことが分かるだけです。
takk@deb9:~$ gfortran tac1.f takk@deb9:~$ ./a.out x00 takk@deb9:~$
次は格納した配列の内容を表示するプログラムに改造します。
takk@deb9:~$ cat tac2.f PROGRAM cat CHARACTER*50 ARGS,LINE,LINES(100) INTEGER N,NUM NFLAG=0 N = IARGC() NUM=1 DO 11111 I=1,N CALL GETARG(I,ARGS) OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1), 1 STATUS='OLD', 2 ACCESS='SEQUENTIAL') 10 READ(10,*,END=100) LINE LINES(NUM) = LINE NUM=NUM+1 GOTO 10 100 CLOSE(10,STATUS='KEEP') 11111 CONTINUE DO 22222 I=1,NUM-1 WRITE(*,33333) LINES(I) 22222 CONTINUE 33333 FORMAT(A) STOP END takk@deb9:~$
結果です。
takk@deb9:~$ gfortran tac2.f takk@deb9:~$ ./a.out x00 10 20 30 40 50 60 70 80 90 100 takk@deb9:~$
最後に表示する配列の要素が逆になるような添え字への計算を加えます。
DO 22222 I=1,NUM-1 WRITE(*,33333) LINES(NUM-I) 22222 CONTINUE
このように修正しました。
結果です。
takk@deb9:~$ gfortran tac3.f takk@deb9:~$ ./a.out x00 100 90 80 70 60 50 40 30 20 10 takk@deb9:~$
コメント