Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Chaînes de caractères

SCAN

Chercher une chaîne dans une zone

Cherche la chaîne du facteur 1 dans celle du facteur 2 et range la position trouvée (0 si absente) dans la zone résultat ; l'indicateur 58-59 s'allume si elle est trouvée.

Syntaxe

     C           cherch    SCAN base      pos     20     58
     C           cherch:lg SCAN base:dep  pos     20     58
     C           cherch    SCAN base      tabpos         58
Facteur 1 (18-27)
La chaîne cherchée : un littéral ou une zone, éventuellement suivie de :longueur pour n'utiliser que les premiers caractères de la zone. Sans longueur, c'est toute la zone qui est cherchée, blancs de fin compris.
Facteur 2 (33-42)
La zone dans laquelle on cherche, éventuellement suivie de :début, la position où commence la recherche (1 par défaut).
Zone résultat (43-48)
Soit une zone numérique sans décimale qui reçoit la position de la première occurrence, soit un tableau numérique qui reçoit les positions de toutes les occurrences. 0 si la chaîne n'est pas trouvée.
Indicateurs (58-59)
Facultatif : s'allume quand la chaîne est trouvée, s'éteint sinon.
Effet
La zone résultat contient la position de la première occurrence (ou 0). Avec un tableau, les postes reçoivent les positions de toutes les occurrences, dans l'ordre, et les postes en trop sont à 0. L'indicateur 58-59 est allumé si la chaîne est trouvée. La recherche tient compte des majuscules et des minuscules.

À quoi ça sert

SCAN répond à la question « où se trouve ce morceau de texte ? » : repérer une marque dans un libellé, tester qu'un mot figure dans une désignation, chercher un séparateur avant de découper avec SUBST.

Exemple 1 : Position et indicateur 58-59

     H*  SCAN : position de la premiere occurrence, 0 si absente
     C                     MOVEL'Dupont'  NOM     6
     C           'on'      SCAN NOM       POS     20     58
     C           POS       DSPLY
     C           *IN58     DSPLY
     C           'xy'      SCAN NOM       POS            58
     C           POS       DSPLY
     C           *IN58     DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

 4
1
 0
0

« on » est cherché dans « Dupont » : la zone résultat POS vaut 4 et l'indicateur 58 est allumé. Pour « xy », POS vaut 0 et l'indicateur 58 est éteint.

Exemple 2 : Départ, et résultat dans un tableau

     H*  SCAN : depart, longueur cherchee, resultat dans un tableau
     E                    TPOS        4  2 0
     C                     MOVEL'banane'  MOT     6
     C                     Z-ADD3         DEP     20
     C           'an'      SCAN MOT:DEP   POS     20     58
     C           POS       DSPLY
     C           'a'       SCAN MOT       TPOS           58
     C           TPOS,1    DSPLY
     C           TPOS,2    DSPLY
     C           TPOS,3    DSPLY
     C           TPOS,4    DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

 4
 2
 4
 0
 0

Dans « banane », la recherche de « an » à partir de la position 3 donne 4 (l'occurrence en position 2 est ignorée). Quand la zone résultat est un tableau (TPOS, déclaré en spécification E), SCAN y range toutes les positions de la lettre « a » : 2 et 4, le reste du tableau est à 0.

Exemple 3 : Blancs de fin et casse

     H*  SCAN : la zone cherchee garde ses blancs de fin, la casse compte
     C                     MOVEL'Dupont'  NOM    12
     C                     MOVEL'on'      CHERCH 10
     C           CHERCH    SCAN NOM       POS     20     58
     C           POS       DSPLY
     C           CHERCH:2  SCAN NOM       POS            58
     C           POS       DSPLY
     C                     MOVEL'ON'      CHERCH
     C           CHERCH:2  SCAN NOM       POS            58
     C           POS       DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

 0
 4
 0

La zone CHERCH fait 10 caractères et contient « on » suivi de 8 blancs : sans longueur, c'est « on » avec ses 8 blancs qui est cherché, et le résultat est 0. Avec CHERCH:2, « on » est trouvé en position 4. Avec « ON », le résultat est de nouveau 0 : la casse compte.

Le piège

La zone cherchée garde ses blancs de fin. Une zone de 10 caractères qui contient « on » ne se retrouve pas dans « Dupont » : il faut écrire CHERCH:2 (troisième exemple), avec la longueur utile, que CHEKR sait calculer.

La longueur en facteur 1 ne peut pas dépasser celle de la zone du facteur 2 : le compilateur refuse la ligne avec QRG7218, « La longueur indiquée en facteur 1 est invalide pour l'opération SCAN ».

En RPG ILE full free

En RPG ILE, %SCAN renvoie la position (0 si absente) ; il n'y a plus d'indicateur ni de tableau de résultats. Pour toutes les occurrences, on boucle en repartant après la précédente.

pos = %scan('on':nom);
if pos > 0;
  dsply pos;
endif;
pos = %scan('an':mot:3);