Hash of anonymous hashes : probleme avec une key/pair
Bonjour tout le monde,
J'ai un probleme avec bout de code et je n'arrive pas a en comprendre la raison. J'ai une clé unqiue de hash qui est recrée en permanance et je ne sais pas pourquoi. Si quelqu'un a une idee, ce serait super ;)
%ulm_msg : Juste des data TAG=VALEUR| - un exemple dans ci-dessous.
@ulm_tags : contient MSGTYPE GCCI.PRODUCT.FLOW EXECSERVPRODUCT
Toutes les autres valeurs sont initialisées dans le code ci-dessous:
Code:
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
| # Creation of a hash of anonymous hash
# Model is : KeyTag => { KeyVal => Frequency }
# Example: 35 => { D => 10 }
# 35 => { G => 3 }
foreach $h_tag (@ulm_tags){
$ulm_keys{$h_tag}{"FAKE"} = "FAKE";
# [ULM TAGS]: [ MSGTYPE | GCCI.PRODUCT.FLOW | EXECSERVPRODUCT ]
# %ULM KEYS: GCCI.PRODUCT.FLOW => { 1 => 1 }
# %ULM KEYS: MSGTYPE => { 1 => 1 }
}
# Populating the hash of anonymous hash
while (($key, $value) = each(%ulm_msg)) {
foreach $h_tag (keys %ulm_keys) {
if($value =~ /$h_tag/){
$value =~ /\|$h_tag=([^|]*)/;
$h_val = $1;
printf "\nh_tag:h_val => ".$h_tag.":".$h_val."\n";
if(exists $ulm_keys{$h_tag}{$h_val}){
$ulm_keys{$h_tag}{$h_val} => $ulm_keys{$h_tag}{$h_val}++;
printf "Incrementing a hash entry: ".$h_tag.":".$h_val."=>".$ulm_keys{$h_tag}{$h_val}."\n";
}
else{
$ulm_keys{ $h_tag } = {
$h_val => 1,
};
printf "Adding a new hash entry: ".$h_tag.":".$h_val."=>".$ulm_keys{$h_tag}{$h_val}."\n";
if($h_val eq "AQUA"){
printf "ULM: ".$value."\n";
}
}
}
}
}
# Display the Hash
printf "\n\nHASH OF HASH\n\n";
for $h_tag ( keys %ulm_keys ) {
print "$h_tag: ";
for $h_val ( keys %{ $ulm_keys{$h_tag} } ) {
print "$h_val=$ulm_keys{$h_tag}{$h_val} ";
}
print "\n";
} |
Ce bout de conde semble fonctionner parfaitement, a une exception pret. Pour la key EXECSERVPRODUCT la ligne suivante semble ne pas fonctionner :
Code:
if(exists $ulm_keys{$h_tag}{$h_val}){....
Visiblement le resultat est false ce qui implique qu'on ecrase la key/pair. Mais je ne comprend pas pourquoi.
Ci-dessous un extrait de l'output du script, ca peut aider pour trouver le probleme et comprendre comment les variables sont remplies.
Citation:
h_tag:h_val => MSGTYPE:new
Incrementing a hash entry: MSGTYPE:new=>12
h_tag:h_val => EXECSERVPRODUCT:ARID
Adding a new hash entry: EXECSERVPRODUCT:ARID=>1
h_tag:h_val => GCCI.PRODUCT.FLOW:ATS
Incrementing a hash entry: GCCI.PRODUCT.FLOW:ATS=>13
h_tag:h_val => MSGTYPE:new
Incrementing a hash entry: MSGTYPE:new=>13
h_tag:h_val => EXECSERVPRODUCT:TWAP
Adding a new hash entry: EXECSERVPRODUCT:TWAP=>1
h_tag:h_val => GCCI.PRODUCT.FLOW:ATS
Incrementing a hash entry: GCCI.PRODUCT.FLOW:ATS=>14
h_tag:h_val => MSGTYPE:new
Incrementing a hash entry: MSGTYPE:new=>14
h_tag:h_val => EXECSERVPRODUCT:CLOSE
Adding a new hash entry: EXECSERVPRODUCT:CLOSE=>1
h_tag:h_val => GCCI.PRODUCT.FLOW:ATS
Incrementing a hash entry: GCCI.PRODUCT.FLOW:ATS=>15
h_tag:h_val => MSGTYPE:new
Incrementing a hash entry: MSGTYPE:new=>15
h_tag:h_val => EXECSERVPRODUCT:AQUA
Adding a new hash entry: EXECSERVPRODUCT:AQUA=>1
ULM: 8=FIX.4.2|9=898|35=UL|49=EMC01|56=EMSECS|34=6007|52=20120221-09:59:47|212=831|#EXDESTINATION=L|#GCCI.PRODUCT.EXECUTION_REGION=EMEA|#GCCI.PRODUCT.EXECUTION_SUB_REGION=EMEA|#IDSOURCE=5|#ONBEHALFOFCOMPID=P2|#SECURITYID=VOD.L|#SYMBOL=VOD.L|CLORDID=GGPHCJP9459dd|CREATIONTIME=20120221095947|EXDESTINATION=L|EXECSERVPRODUCT=AQUA|GCCI.CLIENT.COMPID=P2|GCCI.CLIENT.FIXSESSION=TEST_|GCCI.INSTRUMENT.REUTERS_EXCHANGE=L|GCCI.PRODUCT.EXECUTION_REGION=EMEA|GCCI.PRODUCT.EXECUTION_SUB_REGION=EMEA|GCCI.PRODUCT.FLOW=ATS|HANDLINST=care|MSGTYPE=new|ONBEHALFOFCOMPID=P2|ORDERQTY=1|ORDSTATUS=pendingnew|ORDTYPE=market|PLUGINORIGINATOR=TEST__GEN|PLUGINOWNER=TEST__GEN|RICCODE=VOD.L|ROOTCLIENTORDERID=JP9459dd|SENDERCOMPID=TEST_|SIDE=buy|SYMBOL=VOD.L|TARGETCOMPID=_|TIMEINFORCE=day|TRANSACTTIME=20120221095945806|ULFROMSESSIONNAME=TEST__GEN|ULTOSESSIONNAME=PULM_EMC01_EMSECS||10=219|
h_tag:h_val => GCCI.PRODUCT.FLOW:ATS
Incrementing a hash entry: GCCI.PRODUCT.FLOW:ATS=>16
h_tag:h_val => MSGTYPE:new
Incrementing a hash entry: MSGTYPE:new=>16
h_tag:h_val => EXECSERVPRODUCT:TWAP
Adding a new hash entry: EXECSERVPRODUCT:TWAP=>1
h_tag:h_val => GCCI.PRODUCT.FLOW:ATS
Incrementing a hash entry: GCCI.PRODUCT.FLOW:ATS=>17
h_tag:h_val => MSGTYPE:new
Incrementing a hash entry: MSGTYPE:new=>17
h_tag:h_val => EXECSERVPRODUCT:AQUA
Adding a new hash entry: EXECSERVPRODUCT:AQUA=>1
ULM: 8=FIX.4.2|9=898|35=UL|49=EMC01|56=EMSECS|34=6009|52=20120221-09:59:47|212=831|#EXDESTINATION=L|#GCCI.PRODUCT.EXECUTION_REGION=EMEA|#GCCI.PRODUCT.EXECUTION_SUB_REGION=EMEA|#IDSOURCE=5|#ONBEHALFOFCOMPID=_P4|#SECURITYID=VOD.L|#SYMBOL=VOD.L|CLORDID=GGPHCJP9461dd|CREATIONTIME=20120221095947|EXDESTINATION=L|EXECSERVPRODUCT=AQUA|GCCI.CLIENT.COMPID=_P4|GCCI.CLIENT.FIXSESSION=TEST_|GCCI.INSTRUMENT.REUTERS_EXCHANGE=L|GCCI.PRODUCT.EXECUTION_REGION=EMEA|GCCI.PRODUCT.EXECUTION_SUB_REGION=EMEA|GCCI.PRODUCT.FLOW=ATS|HANDLINST=care|MSGTYPE=new|ONBEHALFOFCOMPID=_P4|ORDERQTY=1|ORDSTATUS=pendingnew|ORDTYPE=market|PLUGINORIGINATOR=TEST__GEN|PLUGINOWNER=TEST__GEN|RICCODE=VOD.L|ROOTCLIENTORDERID=JP9461dd|SENDERCOMPID=TEST_|SIDE=buy|SYMBOL=VOD.L|TARGETCOMPID=|TIMEINFORCE=day|TRANSACTTIME=20120221095945806|ULFROMSESSIONNAME=TEST__GEN|ULTOSESSIONNAME=PULM_EMC01_EMSECS||10=213|
HASH OF HASH!
GCCI.PRODUCT.FLOW: ATS=17
MSGTYPE: new=17
EXECSERVPRODUCT: AQUA=1
Comme vous pouvez le constater la key/pair => EXECSERVPRODUCT:AQUA est recrée plus d'une fois. les autres key/pairs sont bonnes.
Si quelqu'un a une idée du pourquoi, du comment, je suis prenneur !
Merci d'avance ;)