FORTRANです。
今回はまったく作れる気がしないrevコマンドを作ろうかと思います。
revコマンドは、テキストを左右逆にするコマンドです。使い方はこんな感じです。
takk@deb9:~$ seq 12345 12349 > x00 takk@deb9:~$ cat x00 12345 12346 12347 12348 12349 takk@deb9:~$ rev x00 54321 64321 74321 84321 94321 takk@deb9:~$
ではFORTRANのプログラムを作っていきます。いきなり左右逆は難しいので、ただそのまま表示するだけのサブルーチンREVを作ります。`
takk@deb9:~$ cat rev1.f
PROGRAM cat
CHARACTER*100 ARGS,LINE
INTEGER N
N = IARGC()
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
CALL REV(LINE)
GOTO 10
100 CLOSE(10,STATUS='KEEP')
11111 CONTINUE
STOP
END
SUBROUTINE REV(LINE)
CHARACTER*50 LINE
WRITE(*,33333) LINE
33333 FORMAT(A)
RETURN
END
takk@deb9:~$
実行すると、
takk@deb9:~$ ./a.out x00 12345 12346 12347 12348 12349 takk@deb9:~$
期待通り表示されました。
では文字列を左右逆に表示していきます。
文字列変数は、変数名(先頭:最後) で、部分抽出ができるのでそれを使うことにします。
SUBROUTINE REV(LINE)
CHARACTER*50 LINE
WRITE(*,33333) LINE(5:5)
33333 FORMAT(A)
RETURN
END
takk@deb9:~$ ./a.out x00 5 6 7 8 9 takk@deb9:~$
普通に配列として1文字アクセスできないかなと思い、このようなプログラムも作ってみましたが、こちらはビルドエラーになりました。
SUBROUTINE REV(LINE)
CHARACTER*50 LINE
WRITE(*,33333) LINE(5)
33333 FORMAT(A)
RETURN
END
1文字だけ抽出することで、文字列の最後の位置から逆順に表示していけばrevコマンドのできあがりです。
takk@deb9:~$ cat rev2.f
PROGRAM cat
CHARACTER*100 ARGS,LINE
INTEGER N
N = IARGC()
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
CALL REV(LINE)
GOTO 10
100 CLOSE(10,STATUS='KEEP')
11111 CONTINUE
STOP
END
SUBROUTINE REV(LINE)
CHARACTER*100 LINE
INTEGER SP_FLAG,LOC
SP_FLAG=0
DO 2222 I=1,10
LOC=10-I+1
IF(SP_FLAG.EQ.0) THEN
IF(LINE(LOC:LOC).NE. ' ') THEN
SP_FLAG=1
GOTO 1111
END IF
GOTO 2222
END IF
1111 WRITE(*,33333) LINE(LOC:LOC)
2222 CONTINUE
WRITE(*,*) ''
RETURN
33333 FORMAT(A$)
END
takk@deb9:~$
結果です。
takk@deb9:~$ ./a.out x00 54321 64321 74321 84321 94321 takk@deb9:~$


コメント