用cobol计算变量的长度字符串

use*_*335 2 cobol

我在数据库表中有一个注释如何计算该字符串的长度?

我有一个变量定义如

10 NOTE.
    49 NOTE-LEN          PIC S9(4) USAGE COMP.
    49 NOTE-TEXT         PIC X(500).
Run Code Online (Sandbox Code Playgroud)

注意是一个500个字符的字符串.我想计算音符长度.

Bil*_*ger 8

这是一种常见的方式:

MOVE ZERO TO count-of-trailing-spaces                                     

INSPECT FUNCTION REVERSE ( NOTE-TEXT )                       
   TALLYING count-of-trailing-spaces                                        
   FOR LEADING SPACE

SUBTRACT count-of-trailing-spaces                                     
  FROM LENGTH OF ( NOTE-TEXT )
  GIVING NOTE-LEN
Run Code Online (Sandbox Code Playgroud)

FUNCTION REVERSE将字段的字节交换为相反的顺序.INSPECT没有TALLYING ... TRAILING(除了某些供应商的编译器,但它是非标准的)因此INSPECT ... LEADING ...可以在字段颠倒后使用.

有时候我应该把我的讽刺帽子拿走.如果使用FUNCTION REVERSE,首先检查字段是否有空格,没有必要反转500个空格,然后计算500个前导空格.

还"知道你的数据".如果笔记大多是短的,并且你做了很多笔记,你可能想要调查是否需要更快速的东西.这取决于你的数据和硬件是否有从中受益,但要记住它.

值得研究的是,线上的某些东西是否真的知道这个领域有多长,并且已经可以告诉你了.

我只是从后面循环,计算空格(首先检查所有空间后).减少对CPU的压力.一种方法:

IF NOTE-TEXT EQUAL TO SPACE
    MOVE ZERO TO NOTE-LEN
ELSE
    MOVE LENGTH OF NOTE-TEXT TO NOTE-LEN
    PERFORM 
      UNTIL NOTE-TEXT-BYTE ( NOTE-LEN ) 
        NOT EQUAL TO SPACE
          SUBTRACT +1 FROM NOTE-LEN
    END-PERFORM
END-IF
Run Code Online (Sandbox Code Playgroud)

当然,这需要NOTE-TEXT-BYTE作为其组成部分的定义NOTE-TEXT.

49级可能很重要,所以不能这么干净:

49  NOTE-TEXT         PIC X(500).
49  NOTE-TEXT-BYTE
      REDEFINES NOTE-TEXT
      OCCURS 500      PIC X. 
Run Code Online (Sandbox Code Playgroud)

也许49s提供了一些参考修改的案例.也许不是.