Bonjour,
J'ai tout juste débuté en Perl et je bute sur des problèmes d'utilisation et de transfert de tableaux associatifs entre les différentes fonctions de mon petit programme.
L'objectif de ce programme est de calculer le nom de champ le plus long d'une table SQL.
Le process du code est le suivant :
- Je définis dans %sqlv_tables la liste de mes champs avec les alias des tables utilisées.
- Je boucle sur les tables (CONTRAT et ETABLISSEMENT)
- Pour chaque table j'appelle la fonction getMaxFieldNameLength qui, elle, boucle sur chaque alias de la table (en l'occurrence, un seul par table ici), puis sur chaque champ pour déterminer lequel a le nom le plus long :
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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 use strict; use Data::Dumper; our %sqlv_tables = ('CONTRAT'=> ('c'=> ('numeroContrat'=>'OK', 'dateContrat'=>'OK')), 'ETABLISSEMENT'=> ('e'=> ('codeEtablissement'=>'OK'))); print "\n Tables : \n\n"; foreach my $tableName (keys (%sqlv_tables)) { print $tableName." : "; print Dumper $sqlv_tables{$tableName}; my $maxFieldNameLength = getMaxFieldNameLength($sqlv_tables{$tableName}); print "$tableName : nom de champ le plus long = ".$maxFieldNameLength; print "\n\n\n\n\n"; } print "\n"; sub getMaxFieldNameLength { my %tableAliases=shift; print "\n=======\n"; print Dumper \%tableAliases; print "\n=======\n"; my $maxLength = 0; foreach my $tableAlias (keys (%tableAliases)) { print "Alias table = ".$tableAlias."\n"; print Dumper $tableAliases{$tableAlias}; foreach my $field (keys {$tableAliases{$tableAlias}}) { $maxLength = length($field) if ($maxLength lt length($field)); print $field; } } return $maxLength; }
Le résultat de cette exécution est le suivant :
(c'est un peu verbeux !)
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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 Tables : ETABLISSEMENT : $VAR1 = 'e'; ======= $VAR1 = { 'e' => undef }; ======= Alias table = e $VAR1 = undef; ETABLISSEMENT : nom de champ le plus long = 0 codeEtablissement : $VAR1 = 'OK'; ======= $VAR1 = { 'OK' => undef }; ======= Alias table = OK $VAR1 = undef; codeEtablissement : nom de champ le plus long = 0 CONTRAT : $VAR1 = 'c'; ======= $VAR1 = { 'c' => undef }; ======= Alias table = c $VAR1 = undef; CONTRAT : nom de champ le plus long = 0 dateContrat : $VAR1 = 'OK'; ======= $VAR1 = { 'OK' => undef }; ======= Alias table = OK $VAR1 = undef; dateContrat : nom de champ le plus long = 0 numeroContrat : $VAR1 = 'OK'; ======= $VAR1 = { 'OK' => undef }; ======= Alias table = OK $VAR1 = undef; numeroContrat : nom de champ le plus long = 0
Il y a plusieurs choses que je ne comprends pas :
- J'ai demandé à boucler sur les clés de %sqlv_tables. Pour moi, ça se limite à CONTRAT et ETABLISSEMENT, pourtant l'exécution boucle aussi sur numeroContrat, dateContrat et codeEtablissement, pourquoi ?
- Lorsque je passe par exemple $sqlv_tables{'ETABLISSEMENT'} à ma fonction et que j'affiche son contenu, ça donne :
Pourquoi ? Pourquoi n'arrive-t-il pas à trouver le contenu de ce tableau au niveau de la clé "e" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $VAR1 = { 'e' => undef };
Merci pour votre indulgence ! Je pense que Perl est un langage intéressant mais je débute...
Partager