Menu

COBOL - Inspect Statements


A instrução INSPECT é usada para executar várias operações em dados de string. Cada um dos quatro formatos funciona de forma ligeiramente diferente e é descrito abaixo,

  1. INSPECT TALLYING: Este formato é usado para contar ocorrências de caracteres ou strings dentro de outra string.

  2. INSPECT REPLACING:Este formato é usado para substituir ocorrências de caracteres ou strings dentro de outra string. As strings de substituição devem ter o mesmo comprimento que a string original.

  3. INSPECT TALLYING REPLACING: Este formato é usado para contar ao substituir ocorrências de caracteres ou strings dentro de outra string. É basicamente uma combinação dos dois primeiros formatos.

  4. INSPECT CONVERTING: Este formato é usado para substituir ocorrências de caracteres dentro de outra string usando apenas um INSPECT.

    Qualquer ocorrência no primeiro caractere do CONVERTING na string inspecionada será substituída pelo primeiro caractere na string TO, enquanto as ocorrências do segundo caractere na string CONVERTING serão substituídas pelo segundo caractere na string TO, e assim por diante . A string CONVERTING deve ter o mesmo comprimento que a string to.
Vamos ver cada formato em detalhes abaixo,

INSPECT TALLYING:

A opção de contagem é usada para contar os caracteres da string.

Syntax:

INSPECT identifier-1 TALLYING identifier-2 FOR CHARACTERS.
INSPECT identifier-1 TALLYING identifier-2 FOR CHARACTERS [BEFORE/AFTER] [INITIAL] identifier-3 or literal-1.
INSPECT identifier-1 TALLYING identifier-2 FOR ALL [BEFORE/AFTER] [INITIAL] identifier-3 or literal-1.
INSPECT identifier-1 TALLYING identifier-2 FOR LEADINGS [BEFORE/AFTER] [INITIAL] identifier-3 or literal-1.

Esta frase conta as ocorrências de um caractere específico ou caractere especial em um item de dados.
  • identifier-1 é o item inspecionado e pode ser um item de grupo alfanumérico ou um item de grupo nacionalm.

  • identifier-2 é o campo de contagem e deve ser um item inteiro elementar.

  • identifier-3 or literal-1 é o campo de contagem (o item cujas ocorrências serão computadas).

  • CHARACTERS Quando CHARACTERS é especificado e nem a frase BEFORE nem AFTER é especificada, o campo de contagem (identificador-2) é aumentado em 1 para cada caractere (incluindo o caractere de espaço) no item inspecionado (identificador-1). Assim, a execução de uma instrução INSPECT com a frase TALLYING aumenta o valor no campo de contagem pelo número de posições de caracteres no item inspecionado.

  • ALL Quando ALL é especificado e nem a frase BEFORE nem AFTER é especificada, o campo de contagem (identificador-2) é aumentado em 1 para cada ocorrência não sobreposta do comparador de contagem (identificador-3 ou literal-1) no item inspecionado (identificador- 1), começando na posição do caractere mais à esquerda e continuando até a mais à direita.

  • LEADING Quando LEADING é especificado e nem a frase BEFORE nem AFTER é especificada, o campo de contagem (identificador-2) é aumentado em 1 para cada ocorrência contígua não sobreposta da comparação de contagem no item inspecionado (identificador-1), desde que o mais à esquerda ocorrência é no ponto em que a comparação começou no primeiro ciclo de comparação para o qual o comparador de contagem é elegível para participar.
Exemplo:

01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.
...........
      INSPECT WS-STRING TALLYING WS-CNT1 FOR CHARACTER.
      DISPLAY "WS-CNT1 : "WS-CNT1.

      INSPECT WS-STRING TALLYING WS-CNT2 FOR ALL 'A'.
      DISPLAY "WS-CNT2 : "WS-CNT2.

Output:

WS-CNT1 : 15
WS-CNT2 : 06

INSPECT REPLACING:

Essa frase preenche todo ou partes de um item de dados com caracteres especificados, como espaços ou zeros.

Syntax:

INSPECT identifier-1 REPLACING CHARACTERS BY identifier-5 or literal-3.
INSPECT identifier-1 REPLACING CHARACTERS BY identifier-5 or literal-3 [BEFORE/AFTER] [INITIAL] identifier-4 or literal-2.
INSPECT identifier-1 REPLACING ALL identifier-3 or literal-1 BY identifier-5 or literal-3.
INSPECT identifier-1 REPLACING ALL identifier-3 or literal-1 BY identifier-5 or literal-3 [BEFORE/AFTER] [INITIAL] identifier-4 or literal-2.
INSPECT identifier-1 REPLACING LEADING identifier-3 or literal-1 BY identifier-5 or literal-3.
INSPECT identifier-1 REPLACING LEADING identifier-3 or literal-1 BY identifier-5 or literal-3 [BEFORE/AFTER] [INITIAL] identifier-4 or literal-2.
INSPECT identifier-1 REPLACING FIRST identifier-3 or literal-1 BY identifier-5 or literal-3.
INSPECT identifier-1 REPLACING FIRST identifier-3 or literal-1 BY identifier-5 or literal-3 [BEFORE/AFTER] [INITIAL] identifier-4 or literal-2.

Esta frase conta as ocorrências de um caractere específico ou caractere especial em um item de dados.
  • identifier-1 é o item inspecionado e pode ser um item de grupo alfanumérico ou um item de grupo nacional.

  • identifier-3 or literal-1 é o campo de assunto, que identifica os caracteres a serem substituídos.

  • identifier-5 or literal-3é o campo de substituição (o item que substitui o campo de assunto). O campo de assunto e o campo de substituição devem ter o mesmo comprimento.

  • CHARACTERS BY Quando a frase CHARACTERS BY é usada, o campo de substituição deve ter uma posição de caractere de comprimento. Quando CHARACTERS BY é especificado e nem a frase BEFORE nem AFTER é especificada, o campo de substituição substitui cada caractere no item inspecionado (identificador-1), começando na posição do caractere mais à esquerda e continuando até a mais à direita.

  • ALL Quando ALL é especificado e nem a frase BEFORE nem AFTER é especificada, o campo de substituição substitui cada ocorrência não sobreposta do campo de assunto no item inspecionado (identificador-1), começando na posição do caractere mais à esquerda e continuando até a mais à direita.

  • LEADINGQuando LEADING é especificado e nem a frase BEFORE nem AFTER é especificada, o campo de substituição substitui cada ocorrência contígua não sobreposta do campo assunto no item inspecionado (identificador-1), desde que a ocorrência mais à esquerda esteja no ponto em que a comparação começou em o primeiro ciclo de comparação para o qual este campo de substituição é elegível para participar.

  • FIRST Quando FIRST é especificado e nem a frase BEFORE nem AFTER é especificada, o campo de substituição substitui a ocorrência mais à esquerda do campo de assunto no item inspecionado (identificador-1).
Exemplo:

No exemplo a seguir, a instrução INSPECT examina e substitui caracteres no item de dados DATA-3. Cada caractere que precede a primeira ocorrência de aspas ("") é substituído pelo caractere 0.

  77  COUNTR            PIC 9   VALUE ZERO.
  01  DATA-3            PIC X(8).
  . . .
      INSPECT DATA-3
        REPLACING CHARACTERS BY ZEROS BEFORE INITIAL QUOTE.

DATA-3 beforeCOUNTR afterDATA-3 after
456"ABEL0000"ABEL
ANDES"12000000"12
"TWAS BR0"TWAS BR

INSPECT TALLYING REPLACING:

Conta as ocorrências de caracteres específicos e preenche todo ou partes de um item de dados com caracteres especificados, como espaços ou zeros.

Syntax:

 Combination of TALLING and REPLACING syntax

A única diferença é First
Quando FIRST é especificado e nem a frase BEFORE nem AFTER é especificada, o campo de substituição substitui a ocorrência mais à esquerda do campo de assunto no item inspecionado (identificador-1).

Quando as frases TALLYING e REPLACING são especificadas (formato 3), a instrução INSPECT é executada como se uma instrução INSPECT TALLYING (formato 1) fosse especificada, seguida imediatamente por uma instrução INSPECT REPLACING (formato 2).

As seguintes regras de substituição se aplicam:
  1. Quando o campo assunto é uma constante figurativa, o campo de substituição de um caractere substitui cada caractere no item inspecionado que é equivalente à constante figurativa.

  2. Quando o campo de substituição é uma constante figurativa, o campo de substituição substitui cada ocorrência não sobreposta do campo assunto no item inspecionado.

  3. Quando os campos de assunto e substituição são cadeias de caracteres, a cadeia de caracteres especificada no campo de substituição substitui cada ocorrência não sobreposta do campo de assunto no item inspecionado.

  4. Após a substituição ter ocorrido em uma determinada posição de caractere no item inspecionado, nenhuma outra substituição para essa posição de caractere é feita nesta execução da instrução INSPECT.
Exemplo:

No exemplo a seguir, a instrução INSPECT examina e substitui caracteres no item de dados DATA-2. O número de vezes que um zero à esquerda (0) ocorre no item de dados é acumulado em COUNTR. A primeira instância do caractere A que segue a primeira instância do caractere C é substituída pelo caractere 2.

77  COUNTR            PIC 9   VALUE ZERO.
01  DATA-2            PIC X(11).
. . .
    INSPECT DATA-2
      TALLYING COUNTR FOR LEADING "0"
      REPLACING FIRST "A" BY "2" AFTER INITIAL "C".

DATA-2 beforeCOUNTR afterDATA-2 after
00ACADEMY00200AC2DEMY00
0000ALABAMA40000ALABAMA
CHATHAM00000CH2THAM0000

INSPECT CONVERTING:

Converte todas as ocorrências de um caractere específico ou cadeia de caracteres em um item de dados (identificador-1) em caracteres de substituição fornecidos pelo usuário.

Syntax:

INSPECT identifier-1 CONVERTING identifier-6 or literal-4 TO identifier-7 or literal-5
INSPECT identifier-1 CONVERTING identifier-6 or literal-4 TO identifier-7 or literal-5 [BEFORE/AFTER] [INITIAL] identifier-4 or literal-2.

Esta frase conta as ocorrências de um caractere específico ou caractere especial em um item de dados.
  • identifier-1 é o item inspecionado e pode ser um item de grupo alfanumérico ou um item de grupo nacional.

  • identifier-6 or literal-4 Especifica a cadeia de caracteres a ser substituída. O mesmo caractere não deve aparecer mais de uma vez em literal-4 ou identificador-6.

  • identifier-7 or literal-5 Especifica a cadeia de caracteres de substituição. A cadeia de caracteres de substituição (identificador-7 ou literal-5) deve ter o mesmo tamanho da cadeia de caracteres substituída (identificador-6 ou literal-4).
Exemplo:

O exemplo a seguir mostra o uso de INSPECT CONVERTING com frases AFTER e BEFORE para examinar e substituir caracteres no item de dados DATA-4. Todos os caracteres que seguem a primeira instância do caractere / mas que precedem a primeira instância do caractere ? (se houver) são traduzidos de minúsculas para maiúsculas.

01  DATA-4            PIC X(11).
. . .
    INSPECT DATA-4
      CONVERTING
         "abcdefghijklmnopqrstuvwxyz" TO
         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      AFTER INITIAL "/"
      BEFORE INITIAL"?"

DATA-4 beforeDATA-4 after
a/five/?sixa/FIVE/?six
r/Rexx/RRRrr/REXX/RRRR
zfour?inspezfour?inspe

BEFORE and AFTER phrases (todos os formatos)

Esta frase restringe o conjunto de itens sendo contabilizados ou substituídos.

Não mais do que uma frase BEFORE e uma frase AFTER podem ser especificadas para qualquer frase ALL, LEADING, CHARACTERS, FIRST ou CONVERTING.

identifier-4 or literal-2 é o delimitador. Os delimitadores não são contados ou substituídos.

INITIAL A primeira ocorrência de um item especificado. As frases ANTES e DEPOIS alteram a forma como a contagem e a substituição são feitas:

Quando BEFORE for especificado, a contagem ou substituição do item inspecionado (identificador-1) começa na posição do caractere mais à esquerda e continua até que a primeira ocorrência do delimitador seja encontrada. Se nenhum delimitador estiver presente no item inspecionado, a contagem ou substituição continua em direção à posição do caractere mais à direita.

Quando AFTER for especificado, a contagem ou substituição do item inspecionado (identificador-1) começa com a primeira posição do caractere à direita do delimitador e continua em direção à posição do caractere mais à direita no item inspecionado. Se nenhum delimitador estiver presente no item inspecionado, não ocorre contagem ou substituição.

Pontas:
  • INSPECT REPLACING pode ser usado para converter espaços iniciais em zeros, em um item numérico, por exemplo.

    INSPECT LEADING-SPACE-ITEM REPLACING LEADING SPACES BY ZEROS.

  • INSPECT CONVERTING pode ser usado para converter letras minúsculas em maiúsculas, por exemplo.

    INSPECT MIXED-CASE-ITEM CONVERTING "abcde..." TO "ABCDE...".