4.5 - Manipulação de Strings e Funções Intrínsecas
Trabalhar com strings em PL/I é tranquilo, a linguagem traz um conjunto de funções intrínsecas que permitem extrair, pesquisar, validar e transformar substrings sem esforço. Nesta seção, vamos mostrar os operadores e funções mais usados e, ao final, um exemplo prático que recebe um mapa de bits no padrão ISO 8583 e converte em zeros e uns para indicar quais campos estão presentes na mensagem.
SUBSTR, INDEX, SEARCH, VERIFY, TRIM
SUBSTR(string, posição, comprimento) Retorna parte de
string, começando emposição(1-based), de tamanhocomprimento.INDEX(string, padrão) Retorna a posição da primeira ocorrência de
padrãoemstring, ou 0 se não encontrar.SEARCH(string, conjunto, início) Busca qualquer caractere de
conjuntodentro destring, a partir deinício. Retorna posição ou 0.VERIFY(string, conjunto) Verifica se todos os caracteres de
stringpertencem aconjunto. Retorna zero se todos pertencem, caso contrário a posição do primeiro inválido.TRIM(string) Remove espaços à direita de
stringvariável.
Operações comuns (COMPARE, LENGTH, REPEAT)
COMPARE(a,b) Compara
acomb, retorna –1, 0 ou +1.LENGTH(string) Retorna o tamanho atual de
stringvariável.REPEAT(caractere, vezes) Gera uma string repetindo
caractereo número especificado devezes.
/* bitmap_converter.pl1 */ BITMAP_CONV: PROCEDURE OPTIONS(MAIN);
/* Recebe bitmap hex (16 caracteres) / DCL hexmap CHARACTER(16) VARYING; / Resultado em 64 bits como caracteres '0' ou '1' */ DCL binmap CHARACTER(64) VARYING INIT(''); DCL i, value FIXED BINARY(31); DCL hexchar CHARACTER(1); DCL nibble CHARACTER(4); DCL pos, bitpos FIXED BINARY(31);
/* Ler o hexmap da entrada padrão */ PUT SKIP LIST('Informe bitmap ISO8583 (16 hex):'); GET LIST(hexmap);
/* Validar entrada */ IF VERIFY(UPCASE(hexmap), '0123456789ABCDEF') ^= 0 THEN DO; PUT SKIP LIST('Entrada inválida: use somente dígitos hex.'); STOP; END;
/* Converter cada caractere hex para 4 bits / pos = 1; DO i = 1 TO LENGTH(hexmap); hexchar = SUBSTR(hexmap, i, 1); / Converter hex para valor numérico */ IF hexchar INLIST('A','B','C','D','E','F') THEN value = DIGITS(HEXTOBIN(CHARACTER(hexchar))) ; ELSE value = DECIMAL(DIGITS(hexchar), 16);
Last updated