COBOL统计大小写字母:能否更简洁指定英文字母集合?
优化GnuCOBOL中字母统计的实现方案
问题背景
现有代码通过逐个枚举大小写英文字母('A','B',...,'Z','a','b',...,'z'),使用INSPECT语句统计字符串中的字母数量,这种写法繁琐且易出错,希望通过SPECIAL-NAMES定义字符类简化集合指定,但之前尝试的写法在GnuCOBOL中无效。
可行的SPECIAL-NAMES字符类方案
GnuCOBOL完全支持通过SPECIAL-NAMES的CLASS子句定义自定义字符类,正确写法是利用THRU指定字符范围,避免逐个枚举。
1. 定义通用字母类(大小写合并统计)
IDENTIFICATION DIVISION. PROGRAM-ID. COUNT-ALPHA. DATA DIVISION. WORKING-STORAGE SECTION. 01 INPUT-STRING PIC X(100) VALUE 'Hello COBOL! 2024, GnuCOBOL is great'. 01 TOTAL-ALPHA PIC 9(3) VALUE 0. SPECIAL-NAMES. CLASS ALPHABETIC-ALL IS 'A' THRU 'Z', 'a' THRU 'z'. PROCEDURE DIVISION. INSPECT INPUT-STRING TALLYING TOTAL-ALPHA FOR ALL CLASS ALPHABETIC-ALL. DISPLAY "Total alphabetic characters: " TOTAL-ALPHA. STOP RUN.
2. 分别定义大小写字母类(单独统计)
如果需要区分大小写统计,可拆分定义两个字符类:
SPECIAL-NAMES. CLASS UPPER-CASE IS 'A' THRU 'Z'. CLASS LOWER-CASE IS 'a' THRU 'z'. PROCEDURE DIVISION. INSPECT INPUT-STRING TALLYING UPPER-COUNT FOR ALL CLASS UPPER-CASE. INSPECT INPUT-STRING TALLYING LOWER-COUNT FOR ALL CLASS LOWER-CASE. DISPLAY "Upper case count: " UPPER-COUNT. DISPLAY "Lower case count: " LOWER-COUNT.
关键注意事项
- 避免逐个枚举字符:使用
THRU指定范围是简化写法的核心,同时提升代码可读性和维护性。 - GnuCOBOL编译默认支持该特性:无需额外编译选项,只要语法符合COBOL标准即可运行。
- 字符类命名自定义:可以根据业务需求命名(如
ALPHABETIC-ALL、UPPER-CASE等),增强代码语义。
其他替代方案(可选)
如果场景特殊,也可以通过FUNCTION TEST-ALPHABETIC结合循环遍历统计,但效率和简洁性不如INSPECT + CLASS的组合:
PROCEDURE DIVISION. PERFORM VARYING I FROM 1 BY 1 UNTIL I > LENGTH OF INPUT-STRING IF FUNCTION TEST-ALPHABETIC(INPUT-STRING(I:1)) ADD 1 TO TOTAL-ALPHA END-IF END-PERFORM.
内容的提问来源于stack exchange,提问作者bugmagnet
相关产品推荐
相关产品推荐

