Поскольку все переменные в 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 */
Чтобы просто завершить нулем значение, например, сделать вызов функции 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)
РЕДАКТИРОВАТЬ 2012-07-19*
В некоторых наборах символов !
используется вместо |
.Вместо этого можно использовать независимую от CCSID операцию * CAT.См. Веб-сайт IBM здесь и здесь .