🧩今日の学び
・STRING/UNSTRING は「どこまで拾うか」を DELIMITED で決める職人芸
・SIZE は“全部使う”、ALL は“ここで止める”という境界思想
・COBOLが曖昧を許さない理由は「事故を防ぐための世界観」にある
今日のコード
WRITE-DETAIL-LINE.
STRING
"DATE=" DELIMITED BY SIZE F-ORDER-DATE-A DELIMITED BY SIZE
" ID=" DELIMITED BY SIZE F-ORDER-ID-A DELIMITED BY SIZE
" SKU=" DELIMITED BY SIZE F-SKU-A DELIMITED BY SIZE
" QTY=" DELIMITED BY SIZE F-QUANTITY-A DELIMITED BY SIZE
" UNIT=" DELIMITED BY SIZE F-UNIT-PRICE-A DELIMITED BY SIZE
" TAXR=" DELIMITED BY SIZE F-TAX-RATE-A DELIMITED BY SIZE
" CTY=" DELIMITED BY SIZE F-COUNTRY-A(1:2) DELIMITED BY SIZE
" GROSS=" DELIMITED BY SIZE
INTO OUT-REC
END-STRING
WRITE OUT-REC.
WRITE-DETAIL-LINE.
なるお)だから、詳細を書きまっせーってとこかな。
STRINGで文字列だと思うけど、なんの命令なのこれ…
DELIMITED、DELIMITEDうるさいんですけど…何回書けば気がすんじゃい。
係長)おっ、ついに来たな。STRING文。
COBOL界では「文字をくっつける職人芸」みたいな命令だ。
な)職人芸!? そんなに? けん玉の刺す部分に玉を刺せる人?
係)ま、まぁ、それなりに技術はあると思うが…
COBOLには「+」で文字を連結する機能がない。
だから文字をまとめたいときは、STRING文を使うしかない。
たとえばこれ
STRING "Hello " DELIMITED BY SIZE "World" DELIMITED BY SIZE INTO GREETING
って書くと、 GREETING に “Hello World” ができる。
な)え、じゃあ “Hello ” + “World” って書けないの?
STRING文は“くっつけ職人”:COBOLの連結ルール
係)書けない。COBOLは算術の世界の住人だから、「+」は数字専用。
文字を扱うときは、「どこからどこまで」を必ず指定しなきゃならん。
DELIMITED BY SIZE は、「この文字列全体を使え」って意味だ。
もし “F-ORDER-ID-A DELIMITED BY SPACE” みたいに書くと、最初のスペースが出てきた時点で区切る。
つまり「空白までで切る」。
な)あーなるほど、つまり「どこまで読むか」を全部書かなきゃダメってことすね。
なんかめんどくさいっすね。
係)めんどくさいとか言うな!
COBOLは曖昧を嫌う生き物だってことなんだよ。
“DELIMITED”は「区切る基準」を示す呪文みたいなものってことだな。
な)呪文って…社長でも呪い殺そうと?
係)俺の目の前のやつでもいいけどな。
な)だめっすよ、課長を呪い殺しちゃ!
出世できないからって殺っちゃうなんて…でも、いつか…いつか殺ると思ってました!……グスン
って言わせないでくださいね!
係)なんでそうなるんだよ!
…ゴホン。このコードだと
"DATE=" & F-ORDER-DATE-A &
" ID=" & F-ORDER-ID-A &
" SKU=" & F-SKU-A &
...(以下略)...
最終的に全部くっつけて OUT-REC に詰め込んで、最後に WRITE OUT-REC. で出力(ファイルとか画面とか)してる。
な)うわー、息苦しい世界ですねー。エベレストですかここ?
係長と一緒にいるだけで酸素が足りないってのに。
係)お前ね…
な)そうだ酸素バー行きましょ!酸素吸い放題ですよ!
係)わかったわかった、窒素を感じろとか言ってたのは何なんだよ。
いいかCOBOLは「察しない」。全部言わないと動かない。
上司の話をまるで聞かない部下みたいなもんだ。じー。
な)係長!課長いい人ですよ、態度変えて行きましょうよ!
係長の歳で自虐はかなしくなりますから、ね!
係)俺の話はこれっぽっちもしてねーよ!
な)そういえば、DELIMITEDって出しゃばりすぎですけど、実際何なんです?
係)DELIMITED はつまり「どこで区切るか」を示すキーワードだ。
COBOLでの「DELIMITED」は、英語の delimit(境界を決める、区切る)から来てる。
つまり――
“どこまでをひとまとまりとみなすか”
を指定してやるためのものだ
DELIMITEDは“どこまで拾うか”を決める呪文
たとえば、前にやった UNSTRING 覚えてるか?覚えてねーよな?
UNSTRING IN-REC DELIMITED BY ALL ","
INTO F-ORDER-DATE-A
F-ORDER-ID-A
F-BUYER-A
これは「カンマ(,)で区切って分割しろ」って意味だったな。
DELIMITED BY ALL “,” は「カンマが出るたびに切る」。
で、今回の STRING のほうは逆。
STRING "DATE=" DELIMITED BY SIZE F-ORDER-DATE-A DELIMITED BY SIZE
INTO OUT-REC
「複数の文字列をくっつけるとき、どこまでを拾うか」を指定してる。
な)どこまでっつっても、SIZEっつったり、ALLつったり、どっちも同じような感じに見えるんですけど
SIZE と ALL の違い:全部拾うか、境界で止めるか
係)そこに気づくのはだいぶ COBOL 耳になってきた証拠だな。
でもな、SIZE と ALL は似てるようで全然違ぇんだ。
これ整理しとくぞ。
DELIMITED BY SIZE
この項目(文字列)全体を使え」って指定。
つまり「長さぴったり分」を連結・切り出す。
STRING "ABC" DELIMITED BY SIZE
"DEF" DELIMITED BY SIZE
INTO RESULT
これは RESULT に “ABCDEF” が入る。
つまり “全部くっつけろ” の意味。
DELIMITED BY ALL "X"
「“X” が出てきたら、そこで切れ」って指定。
UNSTRING IN-DATA DELIMITED BY ALL ","
INTO ITEM1 ITEM2 ITEM3
カンマで区切って分ける。
こっちは “指定文字を区切りとして扱え” の意味。
DELIMITED BY SPACE
「最初のスペースで終わり」とみなす。
STRING F-NAME DELIMITED BY SPACE
F-AGE DELIMITED BY SIZE
INTO OUT-REC
F-NAME の最初の空白までを使う。
(「名前」と「年齢」をくっつけて出力したいときとか)
な)なるほどーのどぐろー。
SIZEは「範囲で指定」、ALLは「境界で指定」って感じか。
おむすび
係)そうだ。
前者は「全部拾え」、後者は「ここまでで止めろ」。
人生でも同じだな、
“どこまで関わるか” と “どこで切るか” は全然違ぇんだよ。
な)人間もどこまで関わるか、切るかはありますよねー。
係)俺はお前を切ってるけどな。
な)切っても切れないんですね!わかります。
係長)いや、切りたいんだって!
係長のワンポイント
DELIMITED は「どこまで拾うか」を明示する COBOL の境界指定だ。
SIZE は“項目全体をそのまま使え”、ALL は“指定文字が出たらそこで止まれ”。
STRING は“連結の境界”、UNSTRING は“分割の境界”を DELIMITED で決める仕組みだ。
どこまで読むかを自分で書かないと動かない──それが COBOL の流儀。
迷ったら「全部使うなら SIZE、切るなら ALL」とだけ覚えとけ。

コメント