Bonjour,
je m’intéresse beaucoup aux possibilités de programmation fonctionnelle de Perl.
La lecture de la première partie du tutoriel Programmation fonctionnelle en Perl sur les opérateurs de liste m’a été très utile dans la constitution d’expressions pour un script de sauvegardes Oracle (RMAN et datapump) :
Après la lecture de la seconde partie, consacrée aux fonctions d'ordre supérieur, j'ai tenté d'imaginer quelques applications possibles de ces nouvelles notions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 if ( $nb_table ) { $table_string = join ",", map { $_ =~ s/'/\\'/g ; $_ } map { "'" . $_ . "'" } map { $_ =~ s/^.*\/.*\.// ; $_ } @liste_tables; $table_string = ' INCLUDE=TABLE:\"IN \(' . $table_string . '\)\"' ; } [...] if ( $nb_seq ) { $seq_string = join ",", map { $_ =~ s/'/\\'/g ; $_ } map { "'" . $_ . "'" } map { $sql_drop .= 'DROP SEQUENCE ' . $user . '.' . $_ . ";\n" ; $_ } map { $_ =~ s/^.*\/.*\.// ; $_ } @liste_seq; $seq_string = ' INCLUDE=SEQUENCE:\"IN \(' . $seq_string . '\)\"' ; chomp($sql_drop); }
Les fonctions de rappel :
en regardant un de mes derniers programmes, je me suis rendu compte que j'avais plusieurs ouvertures de fichier avec lecture ligne à ligne. Je pensais à créer une fonction générique se chargeant de l'ouverture du fichier, de sa lecture et enfin de sa fermeture. Pour chaque ligne, une fonction de rappel serait appelée pour le traitement correspondant.
Est-ce une bonne idée d'utiliser cette programmation dans ce cas ?
Avez-vous des exemples d'utilisation pour lesquels vous avez eu recours aux fonctions de rappel ?
Les tables de distribution :
au travail, nous utilisons un modèle de programme pour tous nos scripts, quel que soit l'OS.
Chaque script enchaine une série de traitements, fonction des deux premiers arguments qu'il reçoit.
La plupart du temps, le script s'exécute du début à la fin ; par contre, lors de reprises, il nous arrive de le lancer à partir d'une certaine balise, et éventuellement, jusqu'à un autre, située avant la fin normale du script.
La version actuelle de la boucle de traitement principale est :
Une version de test opérationnelle utilisant une table de distribution est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 until ( $reprise eq 'fin' ) { oxa_msg_info ( $r_log, 0,"LABEL : $reprise" ); if ( $reprise eq 'debut') { oxa_msg_info ( $r_log, 0, '==> Début de traitement' ); $reprise = utils_next_step ( 'traitement', $reprise, $fin ); } elsif ( $reprise eq 'traitement') { oxa_msg_info ( $r_log, 0, '==> Traitement' ); process ( $r_log, $r_h_env ); $reprise = utils_next_step ( 'fin_traitement', $reprise, $fin ); } elsif ( $reprise eq 'fin_traitement' ) { oxa_msg_info ( $r_log, 0, '==> Fin de traitement' ); $reprise = utils_next_step ( 'fin', $reprise, $fin ); } else { oxa_msg_err( $r_log, 0, "KO - Etiquette $reprise invalide", 99, $r_h_env ); $reprise = utils_next_step ('fin', $reprise, $fin ); } }
Le programme fonctionne mais j'ai du mal à voir le gain potentiel de cette technique dans le cas présent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 my %dispatch_table = ( debut => sub { $reprise = utils_next_step( 'traitement0', $reprise, $fin ) }, traitement0 => sub { process0 ( $r_log, $r_h_env, $r_h_cpt ); $reprise = utils_next_step( 'traitement1', $reprise, $fin )}, traitement1 => sub { process1 ( $r_log, $r_h_env, $r_h_cpt ); $reprise = utils_next_step( 'traitement', $reprise, $fin )}, traitement => sub { process ( $r_log, $r_h_env, $r_h_cpt ); $reprise = utils_next_step( 'fin', $reprise, $fin )}, fin => sub { $reprise = utils_next_step( 'fin', $reprise, $fin ) }, ); until ( $reprise eq 'fin' ) { if ( defined $dispatch_table{$reprise}) { oxa_msg_info ( $r_log, 0, "$r_h_env->{'dash132'}" ); oxa_msg_info ( $r_log, 0,"LABEL : $reprise" ); $dispatch_table{$reprise}->(); } else { oxa_msg_err( $r_log, 0, "KO - Etiquette $reprise invalide", 99, $r_h_env ); } }
Est-ce plus lisible ? Est-ce judicieux ?
Commentaires, avis, critiques sur mon utilisation des opérateurs de liste, des fonctions de rappel, des tables de distribution bienvenus.
Merci
Partager