COBOLのPERFORM文をマスター!繰り返し処理の基本を学ぼう

2025年4月9日水曜日

COBOL


プログラムを書いていると、「あー、ここ、さっきと同じ処理だ…また書くの面倒だな…」とか、「この処理を10回繰り返したいんだけど、どうすればいいの?」なんて思うこと、ありますよね?

そんなときに大活躍するのが「PERFORM(パフォーム)文」なんです! こいつを使いこなせば、同じ処理を何度も書く手間が省けたり、繰り返し処理がスイスイ書けたりして、プログラミングがぐっと楽になりますよ。 

この記事では、COBOLの縁の下の力持ち、PERFORM文について、ゼロから丁寧に解説していきます。 

 この記事を読むと、こんなことができるようになります
  • PERFORM文が何をする命令なのか、基本がわかる
  • 決まった回数だけ繰り返す方法(TIMES)が身につく
  • ある条件になるまで繰り返す方法(UNTIL)が使えるようになる
  • カウンターを活用して繰り返す方法(VARYING)を習得できる
  • PERFORM文を使うときの、ありがちな失敗と対策がわかる

「繰り返し処理、もう怖くない!」って言えるようになるはず。
さあ、一緒にPERFORM文の達人を目指しましょう!

COBOL PERFORM文とは?プログラムの流れを制御する基本

COBOLの「PERFORM文」とは一体何者なんでしょう?

簡単に言うと、プログラムの中の「特定の処理のまとまり(段落やセクションと呼ばれます)を実行してきて!」と命令するための言葉です。

料理で例えるなら、「手順5の『野菜を炒める』をやって!」みたいに、別の場所に書いてある処理を呼び出すイメージですね。

これができると、2つの大きなメリットがあります。

  • 同じような処理を何度も書かなくて済む!(プログラムがスッキリ!)
  • 決まった回数や、ある条件になるまで、同じ処理を繰り返せる!

プログラムの流れを自由自在に操るための、基本的な命令の一つなんです。これを使わない手はないでしょう?

COBOL PERFORM文の基本的な書き方(構文ルール)

じゃあ、どうやって書くの?って話ですよね。一番シンプルなPERFORM文の書き方はこうです。

PERFORM 段落名.

たったこれだけ!シンプル!
構成要素を見てみましょう。

  • PERFORM
    • 「これから指定する処理を実行せよ!」という命令のキーワード。
  • 段落名
    • 実行してほしい処理が書いてある場所(段落)の名前。自分で好きな名前を付けられます(例:SYORI-A、DATA-CHECKなど)。プログラムのPROCEDURE DIVISIONに `段落名.` という形で定義しておきます。
  • .(ピリオド)
    • 文の終わりを示す記号。COBOLではお約束ですね。忘れずに付けましょう。

セクションという、段落より大きなまとまりを実行する場合も `PERFORM セクション名.` と書けます。

まずは「PERFORM 処理の名前.」この形をしっかり覚えちゃいましょう!

COBOL PERFORM文の使い方①:決まった回数繰り返す(TIMES指定)

「この処理、ちょうど5回繰り返したいんだよなー」そんなときに便利なのが `TIMES` オプションです!

名前の通り、指定した回数だけ、きっちり処理を繰り返してくれます。律儀なやつですね。
例えば、画面に挨拶を3回表示するとか、特定の初期設定を10回行うとか、そんな場面で活躍しますよ。

TIMES指定の書き方

書き方は、基本形に回数を付け加えるだけ。

PERFORM 段落名 回数 TIMES.

「回数」の部分には、

  • 直接数字を書く(例:`3 TIMES`)
  • 回数が入ったデータ項目(変数)を指定する(例:`WS-COUNT TIMES`)
のどちらでもOKです。変数を使えば、状況に応じて繰り返す回数を変えられて便利ですよ。

TIMES指定を使ったサンプルプログラム

百聞は一見にしかず!簡単なサンプルプログラムを見てみましょう。
「HELLO COBOL!」というメッセージを3回表示するプログラムです。

IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-TIMES-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
*> 特に作業領域は使わない

PROCEDURE DIVISION.
MAIN-PROCEDURE.
    DISPLAY "TIMES指定の実行開始".
    PERFORM DISPLAY-MESSAGE 3 TIMES.  *> DISPLAY-MESSAGE段落を3回実行
    DISPLAY "TIMES指定の実行終了".
    STOP RUN.

DISPLAY-MESSAGE. *> ここが実行される段落
    DISPLAY "HELLO COBOL!".

実行結果はこうなります。

TIMES指定の実行開始
HELLO COBOL!
HELLO COBOL!
HELLO COBOL!
TIMES指定の実行終了

ちゃんと3回表示されましたね!簡単でしょう?

COBOL PERFORM文の使い方②:条件を満たすまで繰り返す(UNTIL指定)

今度は、「何回繰り返すかは分からないけど、ある条件になるまで続けたい」というケースです。

例えば、ファイルのデータを最後まで読み込むとか、エラーが発生するまで処理を続けるとか、そんなときに使うのが `UNTIL` オプション。
UNTILは「~まで」という意味なので、まさにその通りの動きをします。

ちょっとだけ補足。UNTILには、条件を先にチェックする `TEST BEFORE`(これが普通)と、処理を1回やってからチェックする `TEST AFTER` があります。まあ、最初は「UNTILで条件を指定するんだな」くらいで大丈夫!

UNTIL指定の書き方

書き方は、基本形に `UNTIL 条件式` を付け加えます。

PERFORM 段落名 UNTIL 条件式.

* TEST BEFORE/AFTER を明示する場合
PERFORM 段落名 WITH TEST BEFORE UNTIL 条件式.
PERFORM 段落名 WITH TEST AFTER UNTIL 条件式.

「条件式」の部分には、変数と値を比べたりします。例えば、

  • `WS-COUNTER > 10` (カウンターが10より大きくなるまで)
  • `FILE-STATUS = "10"` (ファイルステータスが10になるまで ※ファイルの終わりを示すコード例)
  • `WK-FLAG = "ON"` (フラグがONになるまで)
みたいな感じです。ここで使うのが比較演算子(=, >, < など)。

UNTILを使うときは、ループの中で条件を変える処理を忘れないようにしましょう。忘れると無限ループ地獄に…!

UNTIL指定を使ったサンプルプログラム

では、UNTILを使ったサンプルを見てみましょう。
カウンター変数 `WS-COUNT` が5より大きくなるまで、カウンターの値を表示し続けるプログラムです。

IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-UNTIL-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNT PIC 9(1) VALUE 1. *> カウンター変数、初期値は1

PROCEDURE DIVISION.
MAIN-PROCEDURE.
    DISPLAY "UNTIL指定の実行開始".
    PERFORM COUNT-UP UNTIL WS-COUNT > 5. *> WS-COUNTが5より大きくなるまで実行
    DISPLAY "UNTIL指定の実行終了".
    STOP RUN.

COUNT-UP. *> ここが実行される段落
    DISPLAY "現在のカウント: " WS-COUNT.
    ADD 1 TO WS-COUNT. *> カウンターを1増やす(条件を変える処理!)

実行結果はこちら。

UNTIL指定の実行開始
現在のカウント: 1
現在のカウント: 2
現在のカウント: 3
現在のカウント: 4
現在のカウント: 5
UNTIL指定の実行終了

ちゃんと `WS-COUNT` が 1 から 5 まで表示され、6になった時点で条件 `WS-COUNT > 5` が満たされてループが終わりましたね!

COBOL PERFORM文の使い方③:カウンターを使いながら繰り返す(VARYING指定)

さあ、PERFORM文のオプションのボスキャラ(?)登場! `VARYING` オプションです。

これは、カウンターとして使う変数を、指定した初期値から、指定した増分ずつ変化させながら、条件を満たすまで処理を繰り返すという、ちょっと高機能なやつです。

よく使われるのは、配列(テーブルと言います)のデータを順番に処理していくとき。カウンターを配列の添え字(インデックス)にして、1番目、2番目、3番目…と処理を進めるのにピッタリなんです。

`TIMES` や `UNTIL` よりちょっと複雑に見えるかもしれませんが、仕組みが分かれば大丈夫!

VARYING指定の書き方

書き方はこんな感じです。オプションがいくつか付きますね。

PERFORM 段落名
    VARYING カウンター変数 FROM 初期値 BY 増分値 UNTIL 条件式.

それぞれの意味は、

  • VARYING カウンター変数: 値を変化させていく変数(データ項目)を指定します。
  • FROM 初期値: カウンター変数のスタート時の値を指定します。数字か、値が入った変数名を指定。
  • BY 増分値: 1回の繰り返しでカウンター変数にいくつ足す(または引く)かを指定します。数字か変数名で。普通は1ずつ増やすことが多いですね。
  • UNTIL 条件式: ループを終了する条件を指定します。UNTIL指定と同じです。

つまり、「カウンター変数を、初期値からスタートして、増分値ずつ変化させながら、条件式を満たすまで、段落を実行し続けてね!」という意味になります。

VARYING指定を使ったサンプルプログラム

言葉だけだと分かりにくいので、サンプルを見てみましょう。
カウンター `WS-INDEX` を1から1ずつ増やして、5になるまでその値を表示するプログラムです。

IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-VARYING-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INDEX PIC 9(1). *> カウンターとして使う変数

PROCEDURE DIVISION.
MAIN-PROCEDURE.
    DISPLAY "VARYING指定の実行開始".
    PERFORM SHOW-INDEX
        VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 5. *> 1から1ずつ増やし、5を超えたら終了
    DISPLAY "VARYING指定の実行終了".
    STOP RUN.

SHOW-INDEX. *> ここが実行される段落
    DISPLAY "現在のインデックス: " WS-INDEX.

実行結果はこうです。

VARYING指定の実行開始
現在のインデックス: 1
現在のインデックス: 2
現在のインデックス: 3
現在のインデックス: 4
現在のインデックス: 5
VARYING指定の実行終了

UNTIL指定のサンプルと似た結果になりましたが、VARYINGを使うとカウンターの初期化と増やす処理を PERFORM文の中にまとめて書けるので、コードがスッキリしますね!

COBOL PERFORM文を使う上での注意点

便利なPERFORM文ですが、使い方を間違えると予期せぬ動きをしたり、バグの原因になったりすることも…。
ここでは、よくある失敗例と注意点をいくつか紹介します。転ばぬ先の杖ですよ!

  • 無限ループにご用心!
    特に `UNTIL` 指定を使うとき、ループの中で条件が変わるような処理(カウンターを増やすとか、フラグをONにするとか)を書き忘れると、永遠にループが終わらなくなります! プログラムが固まってしまうので、条件式の変数がちゃんと変化するか、必ず確認しましょう。

  • 実行される範囲を意識しよう
    `PERFORM 段落名.` と書いたとき、その段落がどこからどこまでなのか、しっかり把握しておかないと、意図しない処理まで実行されてしまうかもしれません。特に、段落の終わりを示すピリオドの位置は要チェックです。

  • PERFORMの入れ子(ネスト)はほどほどに
    PERFORM文の中で、さらに別のPERFORM文を呼び出すこともできます(入れ子、ネストと言います)。構造が複雑になりすぎると、プログラムの流れが追いづらくなり、バグの温床になることも。深くネストしすぎないように、処理の分割を見直すのも手です。

  • PERFORMされる段落からの脱出
    PERFORMで実行中の段落から、いきなり `GO TO` 文で別の場所に飛んだり、`EXIT PROGRAM` でプログラム自体を終わらせたりするのは、あまり良い作法ではありません。プログラムの流れが分かりにくくなる原因になります。できるだけ、PERFORMが終わって元の場所に戻るように作りましょう。

これらの点を頭の片隅に置いておくだけでも、ミスを減らせるはずです!

【まとめ】COBOL PERFORM文を使いこなしてステップアップ!

お疲れ様でした! COBOLの PERFORM文について、基本的なところから使い方、注意点まで見てきましたが、いかがでしたか?

PERFORM文は、

  • 決まった処理を呼び出す
  • 決まった回数繰り返す (TIMES)
  • 条件を満たすまで繰り返す (UNTIL)
  • カウンターを使いながら繰り返す (VARYING)
といった、プログラムの基本的な流れを作るのに欠かせない命令です。

最初はちょっと戸惑うかもしれませんが、サンプルコードを参考に、実際に自分で書いて動かしてみるのが一番の近道!

PERFORM文をマスターすれば、あなたのCOBOLプログラミングは確実にレベルアップします。面倒な繰り返しも、複雑な処理の呼び出しも、ドンと来い!って感じですね。

さあ、学んだことを活かして、どんどんコードを書いてみましょう! PERFORM文と仲良くなって、COBOLの世界をもっと楽しんでくださいね!応援しています!

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ