Bonjour,
J'ai un bout de code qui fonctionne, avec deux solutions, mais qui ne sont pas propres ni l'une ni l'autre, et une solution élégante mais que je n'arrive pas à faire fonctionner.
La question est: comment faire fonctionner la solution "élégante" ?
Merci d'avance
--------------------------------------------
Description (perl 5.10) :
Les deux tableaux associatifs (hashes) à fusionner comportent des clés communes.
Le premier tableau %hash_bool comporte des valeurs booléennes associées aux clés.
Le second tableau %hash_datas comporte les valeurs à associer aux clés communes (aux 2 tableaux hash_bool et hash_datas).
La subroutine est appelée de cette façon :
@master_common_param et @master_values étant des hashes, $merge_condition n'etant qu'un booléen valant 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part my %hash_common = &hash_merge($merge_condition, @master_common_param, @master_values);
1ere solution "élégante" mais que je n'arrive pas à faire fonctionner probablement à cause d'une mauvaise compréhension des références.
2eme solution, qui fonctionne, mais... beurk, pas belle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 sub hash_merge { my ($merge_condition, $hash_bool, $hash_datas) = @_ ; @hash_bool{ keys %$hash_datas } = values %$hash_datas; return $hash_bool; }
En effet, je recopie les tableaux passés en parametres pour les fusionner. Sinon, je n'arrive pas à accéder à leur contenu. Surement encore cette histoire de reference..
3eme solution: de loin la plus moche, je balaie (hum n x n fois en plus) les 2 tableaux d'entrée avec 2 boucles "while" imbriquées et j'utilise un 3eme tableaux pour le resultat. ça fonctionne mais là, c'est vraiment pas beau et consommateur de ressources.
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 sub hash_merge { # input data: $hash_bool(true) x $hash_values = $hash_merged # constraint: keys from hash_bool being contained in $hash_datas # returns : merged hash my ($merge_condition, $hash_bool, $hash_datas) = @_ ; my %hash_merged; # Sort hashes by key sort keys %$hash_bool; sort keys %$hash_datas; # Duplicate the 2 hashes to tmp (direct access to the hashes does not work, direct copy neither ..) my %tmp_bool; my %tmp_data; while ( my ($key, $value) = each(%$hash_datas) ) { $tmp_data{$key} = $value ; } while ( my ($key, $value) = each(%$hash_bool) ) { $tmp_bool{$key} = $value ; } # Merge the 2 tmp hashes if common existing keys and bool=true while ( my ($key, $value) = each(%tmp_bool) ) { if (exists ($tmp_data{$key}) && $value eq $merge_condition ) { $hash_merged{$key} = $tmp_data{$key} ; } } return %hash_merged; } # end SUB
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 sub hash_merge { # input data: $hash_bool(true) x $hash_values = $hash_merged # constraint: keys from hash_bool being contained in $hash_datas # returns : merged hash my ($merge_condition, $hash_bool, $hash_datas) = @_ ; my %hash_merged; # Sort hashes by key sort keys %$hash_bool; sort keys %$hash_datas; while ( my ($key, $value) = each %$hash_bool) { if ($value eq $merge_condition) { while ( my ($key2, $value2) = each %$hash_datas) { if ($key2 eq $key) { # print "merging : $key, $value2\n" ; $hash_merged{$key} = $value2; } } } } return %hash_merged ;
Partager