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
:longueurpour 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);