🧩今日の学び
・INSPECTは“文字列をなめ回して処理する”ためのCOBOL専用の強力コマンド。
・TALLYING/REPLACING/CONVERTINGの役割を係長の例えツッコミで一気に整理。
・次回は「TRIM実装の本番処理」へ踏み込み、文字列前処理の実務力を上げていく。
今日のコード
*> トリム(前後空白除去:簡易的にINSPECT使用)
PERFORM VARYING LINE-NO FROM 1 BY 1 UNTIL LINE-NO > 1
*> ダミー:GnuCOBOLなら FUNCTION TRIM が使えますが
*> ここでは単純にそのまま扱います
END-PERFORM.
なるお)コメント入ってるから楽勝ね!顔に似合わず、やさしいね係長は。
*> トリム(前後空白除去:簡易的にINSPECT使用)
ほうほう、これがゴミってやつですかな。
てか、INSPECTってなにさ。どこにもないじゃない。横文字使いたかっただけじゃないの?お前のすべてをインスペクトする!とかキャバクラで言ってるだけじゃないの!?
INSPECTの正体:キャバクラじゃなくて文字列職人
係長)お前なぁ、勝手に新サービス始めんな。COBOLは風俗じゃねぇんだよ。
INSPECTってのは正式な命令文だ。「調べる」「変換する」処理に使う。
例えばな、
- INSPECT A TALLYING B FOR ALL “X” → 文字列Aの中にある「X」の数を数えてBに入れる
- INSPECT A REPLACING ALL “ “ BY “-” → Aのスペースを全部ハイフンに置き換える
こういうのができる。
な)こういうのができる、どやあ!じゃないんですよ。
INSPECTってなんなんすかって話っすよ。書いてないことをドヤられても、キャバ嬢たちも困惑してますって。指名されて迷惑そうな顔してますって。
係)なんでキャバクラ行ってる前提になってんだよ。
INSPECTってのはな「文字列を調べたり、数えたり、置き換えたりする命令」だ。
COBOLの世界じゃ、文字列処理がしょぼいから、そのためだけに用意された専用コマンドみたいなもんだ。
INSPECT A TALLYING CNT FOR ALL "X"
Aの中に「X」が何個あるか数えてCNTに入れる。
INSPECT A REPLACING ALL " " BY "-"
Aのスペースを全部ハイフンに置き換える。
INSPECT A CONVERTING "abc" TO "ABC"
Aの中の “a”→”A”, “b”→”B”, “c”→”C” に変換。
な)ほーほー。
つまり、INSPECTと宣言して、したいことをことを書くと、勝手にやってくれるってことですね!
係)「勝手にやってくれる」って言うと語弊あるな。
INSPECT ってのは 「文字列をなめ回して処理するための専用命令」 なんだ。
で、その「なめ回し方」と「やること」を横に並べて書く。
たとえば――
- TALLYING:数える
- REPLACING:置き換える
- CONVERTING:変換する(文字集合をまるっと変える)
これを指定したら、COBOL が「はいはい、じゃあ A の中を最初から最後まで走査して、言われたとおりにやりますわ」って働いてくれる。
な)やっぱ係長、舐め回してたんすね…
係)あーうるせっ。
PERFORM VARYING:カウンタで回すループの世界
PERFORM VARYING LINE-NO FROM 1 BY 1 UNTIL LINE-NO > 1
な)で、なんでこれになったわけです?魔法使い?妖精から魔法使いにジョブチェンです?
おっさんの妖精から魔法使いへのジョブチェンは怪しい感じが激増しますよ。緑のタイツ履いてたりします?
係)ジョブチェンジ言うな。
PERFORM VARYING
ってのは COBOL の ループ構文だ。
LINE-NO って変数を 1 から始めて、1 ずつ増やして、条件満たすまで繰り返せ って命令だな。
な)えー、だって
PROCESS-LOOP.
PERFORM READ-INFILE
UNTIL EOF-YES.
これがループだってドヤ顔してたじゃないすか!これぞチーズだってドヤ顔してたじゃないすか!さすがスイス銀行だ!さすがゴルゴ13だ!さすが、さいとう・たかをだっていってたじゃないですか!?
係)よく覚えてたな。チーズ以降のはなんなんだよ…
PERFORM READ-INFILE UNTIL EOF-YES.
これも確かにループだ。
ただしこれは「処理(READ-INFILE)を繰り返せ、EOF-YESが真になるまで」っていう 条件つきループ。
一方で PERFORM VARYING は「カウンタ変数を変化させながら繰り返す」っていう カウント制御ループなんだよ。
EOFループは「ファイルの終わりまで処理する」系で使う。
VARYINGループは「1から100まで回す」みたいな処理で使う。
という感じだ。
な)でもどっちも終わりがあるんですよね?終わりなき戦いじゃないすよね?宇宙は膨張し続けてるからたどり着かないじゃないすよね?
係)COBOLのループには必ず「終わり」があるにきまってるだろ。
終わらねーのは、お前の無駄口だけだ。
EOFループは「ファイルが終わったら終了」って条件が絶対あるし、VARYINGループは「カウンタが限界を超えたら終了」って条件が決まってる。
PERFORM VARYING I FROM 1 BY 1 UNTIL 1 > 0.
だったら、これはどうです? ニヤリ
TRIMの穴:中身がない“ダミーループ”の正体
係)お前な…
そんな事やったら、追放されるだけだからな。懲戒+追放もあるからな。
な)ひっ!いや、たまたま思いついただけなので…
係)いらんことはなんで簡単に思いつくんだよ!
いいか、ループに「ちゃんと終わる条件」を書くのがプログラマの責任だからな!
- 見た目は「ループ」だけど、中身がない。
- コメントに「TRIM(前後空白削除)」って書いてある。
- でも実際は何もしてない。
つまりどういうことかというと「トリム処理をここでやる想定だが、まだ書いてない」 っていう ダミーのループ なんだよ。
GnuCOBOLなら FUNCTION TRIM(文字列) で一発で空白を削れる。
でも「標準COBOLしかない環境だと TRIM がないから、自前でループ回して空白削除するんだよ」っていう名残を残してる。
その「ループで空白削除する処理の枠」だけ用意して、とりあえず 中身はコメントで誤魔化すというか、コメントでに書き出しておいて準備しておくってってわけだ。
おむすび
な)へー、係長って顔に似合わず細かいですよね。
係)お前のごまかし人生よりマシだ。
な)えー、おれ何も誤魔化してないですよ。正直清廉潔白純情乙女ですよ。
係)そんなこと言うやつが真っ白なわけねーだろ。
な)まぁ屁はこくので真っ白じゃないかもですけど。
係)聞いてねーよ!
係長のワンポイント
INSPECT は「文字列を端から端までなめ回して処理する専用命令」だ。
TALLYING=数える、REPLACING=置き換える、CONVERTING=まとめて変換。
TRIM がない環境では、空白削除も INSPECT や自前ループで対応する。
今回のダミーループはその名残で、GnuCOBOLなら FUNCTION TRIM が最速。
文字列で困ったら、まず INSPECT を思い出せ。

コメント