Bonjour,

j'ai un petit problème sur un script Perl que je dois modifier car les fichiers d'entrée ont changé (le script original n'est pas de moi).
Je construis une table de hachage à partir de données présentes dans deux fichiers, et pas toutes au même endroit.
J'ai choisi comme clef de ma table de hachage le nom de la trame, ça me simplifie les recherches du deuxième foreach.
Sauf que pour une information je dois parser et chercher non pas le nom de la trame mais son numéro dans @files1 (pour remplir le champ TramePer).

Je cherche une solution élégante pour parser le fichier un minimum de fois et éviter l'usine à gaz.
Je connais assez peu perl et les tables de hachage, est-ce qu'il est possible d'avoir 2 clés pour un élément de table de hachage ?
Une solution simple que j'ai en tête serait de créer une deuxième table de hachage avec juste la paire nom et numéro, mais est-ce que je ne dupliquerai pas l'info pour rien ?

PS : le nom comme le numéro de trame sont uniques.

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
sub my_parser {
	my @files1 = @{$_[0]};
	my @files2 = @{$_[1]};
	my $buf_found = "UNDEF";
	foreach (@files1) {
 
		open(ReadHandler, $_) or die ("Erreur d'ouverture du files1 $_") ;
		while (<ReadHandler>) {
			if (/BO_ (\d+) ([0-9a-zA-Z_]+): (\d) /)
			{
				my $buf_var = $2;
				$buf_dico{$buf_var} = {TrameArch => "UNDEF",
								TrameChn => "UNDEF",
								TrameNum => $1,
								TrameAdr => "UNDEF",
								TrameBuf => "UNDEF",
								TrameDir => "UNDEF",
								TrameSize => $3,
								TramePer => "UNDEF"};
			}
		}
		close(ReadHandler);
	}
	foreach (@files2) {
		my $var_data;
		open(ReadHandler, $_) or die ("Erreur d'ouverture du files2 $_") ;
 
		while (<ReadHandler>) {
			if (/begin\sMEASUREMENT\s(\w+)_(lb|c1a)\[0\]$/) {
				$var_data = $1;
				my $arch = $2;
				if (defined($buf_dico{$var_data})) {
					$buf_dico{$var_data}{TrameArch} = $arch;
					$buf_dico{$var_data}{TrameBuf} = "$var_data\_$arch";
				} else {
				$var_data = "UNDEF";
				}
			}
			if ($var_data ne "UNDEF") {
				if (/ECU_ADDRESS\s0x(\w+)$/) {
					$buf_dico{$var_data}{TrameAdr} = $1;
					$var_data = "UNDEF";
				}
			}
		}
		close(ReadHandler);
	}
	print Dumper (\%buf_dico);
}
Merci