Ibm midrange CLLE中的微调变量

Ibm midrange CLLE中的微调变量,ibm-midrange,control-language,Ibm Midrange,Control Language,如何在CLLE中修剪变量???CLLE中没有可用的标准函数修剪。但是, 如果要粘合两个变量,请查看*TCAT(或|),因为CL中的所有变量都是固定长度的,因此没有修剪本身的逻辑要求 若要在不插入空格的情况下连接两个值,请使用| 要查找不包括尾随空格的字符长度,您需要使用%SST(&VAL&POS 1)对该值进行良好的向后遍历,以测试每个字符的空格位置。类似于: DCL &LEN *DEC (15 0) DCL &VAL *CHAR 50 VALUE('Some test dat

如何在CLLE中修剪变量???

CLLE中没有可用的标准函数修剪。但是,


  • 如果要粘合两个变量,请查看*TCAT(或|),因为CL中的所有变量都是固定长度的,因此没有修剪本身的逻辑要求

    若要在不插入空格的情况下连接两个值,请使用
    |

    要查找不包括尾随空格的字符长度,您需要使用%SST(&VAL&POS 1)对该值进行良好的向后遍历,以测试每个字符的空格位置。类似于:

    DCL &LEN *DEC (15 0)
    DCL &VAL *CHAR 50 VALUE('Some test data')
    DCL &CHR15 *CHAR 15
    
    CHGVAR &LEN 50
    LOOP: IF (&LEN > 1 & %SST(&VAL &LEN 1)==' ') (DO)
        CHGVAR &LEN VALUE(&LEN - 1)
        GOTO LOOP
        ENDDO
    
    CHGVAR &CHR15 &LEN
    SNDPGMMSG ('The length is' |> &CHR15) /* Can't concat decimal values */
    
    要简单地为null终止一个值,例如,调用一个C函数:

    DCL &VAL    *CHAR 50 VALUE('Some test text')
    DCL &VALNUL *CHAR 51 /* +1 for the null */
    DCL &NULL   *CHAR  1 VALUE(X'00')
    
    CHGVAR &VALNUL VALUE(&VAL |< &NULL)
    
    dcl   &lPath       *int            value( 0 )
    
    callprc  'triml'  ( +
                        &Dir           +
                        ( ' ' *byval ) +
                      ) +
                rtnval( &lPath )
    
    DCL&VAL*CHAR 50值('一些测试文本')
    DCL和VALNUL*字符51/*+1表示空值*/
    DCL&空*字符1值(X'00')
    CHGVAR和VALNUL值(&VAL |<&NULL)
    
    编辑2012-07-19*


    在某些字符集中,使用
    代替
    |
    。也可以使用与CCSID无关的*CAT操作。请参阅IBM的网站和。

    我知道这很旧,但您可以在%TRIM()、%TRIML()和%TRIMR()之前的版本中使用%TRIM(&myVariable)

    如果可用,ILE CL可以使用“triml”C库函数:

    DCL &VAL    *CHAR 50 VALUE('Some test text')
    DCL &VALNUL *CHAR 51 /* +1 for the null */
    DCL &NULL   *CHAR  1 VALUE(X'00')
    
    CHGVAR &VALNUL VALUE(&VAL |< &NULL)
    
    dcl   &lPath       *int            value( 0 )
    
    callprc  'triml'  ( +
                        &Dir           +
                        ( ' ' *byval ) +
                      ) +
                rtnval( &lPath )
    
    该过程可在*SRVPGM QC2UTIL1中找到

    在OPM和ILE CL中,我经常使用:

    dcl   &lmsgtxt1    *dec  (   5 0 ) value( 0 )
    
    rtvmsg     msgid( cpf9897 ) msgf( QSYS/QCPFMSG ) +
                 msgdta( &SQLStm )    +
                 msglen( &lmsgtxt1 )
    

    在这两种情况下,生成的长度都可以用在%SST()中表达式来实现实际的微调。

    如果需要,我可以给您一个RPG示例。RPG是我在iSeries上的首选语言。*TCAT去除运算符左侧操作数的尾随空格;而右侧操作数的前导空格不去除:-(因此第二个示例表达式的效果是[根据CPD0126,根据不允许作为字符串文字的空字符串的编码,甚至不支持]将匹配TRIMR而不是TRIM的效果[如果首先更正,则使用空白文字。为了强调这一点,第一个示例表达式通常不会删除空白,只会从
    'xyz'
    'xyz'*TCAT'uvw'
    中删除一个尾随空白,而成为
    'xzy uvw'
    ,在哪个版本中引入了这些操作符?操作符
    .
    在我们的V6R1上不起作用。因为字符
    在所有EBCDIC代码页中都不在同一位置,所以我不认为使用它们来代替
    *TCAT
    是一个好主意。@kratenko:看我的编辑-它们至少从V3开始就存在,我敢打赌从V1开始就存在了。从t开始,各种操作符就一直存在he System/38(AS/400系列的前身)。有关i 6.1文档,请参阅表达式中的运算符主题。如果它们在给定系统上不起作用,则问题几乎肯定是设备描述配置不正确;KBDTYPE()和/或CHRID()属性可能与系统配置不匹配。顺便说一句,事实是它们“不工作”在某些系统上不使用它们是最大的原因。对本地系统或给定*DEVD的更改可能会使它们无法工作,即使它们以前工作过。@user2338816:不工作只能应用于尝试编译源代码并收到错误。一旦编译完,源代码中使用的运算符就不相关。这当然没有意义打开以避免使用它们。