OVH Cloud OVH Cloud

Table de hachage contenant des listes

3 réponses
Avatar
Apokrif
J'ai un fichier dictionnaire contenant des lignes du genre "chaise,
fauteuil=seat, chair" (plusieurs mots français pour plusieurs mots
anglais - plusieurs traductions d'un même mot français peuvent être
données à plusieurs lignes différentes): le but est de créer un
tableau associatif qui prend comme clef un mot français et qui renvoie
la liste des mots anglais correspondants. Dans l'exemple, ça devrait
créer une structure du genre:

chaise=>(chair,seat)
fauteuil=>(chair,seat)

J'ai fait:

%traductions=();
while (<PREMIER>){
chomp;
($gauche, $droite)=split(/=/,$_);
@mots_gauche=split (/, /, $gauche);
@mots_droite=split (/, /, $droite);
for $mot (@mots_gauche){
if (!defined($traductions{$mot}))
{
$traductions{$mot}=@mots_droite;
}else{
$traductions{$mot}=($traductions{$mot}, @mots_droite);


}
print $traductions{$mot};
}

}


Et ça ne marche pas: au lieu de sortir les traductions anglaises
(complétées au fur et à mesure), ça m'imprime une suite de chiffres
(ce qui laisse penser que les listes sont interprétées dans un
contexte scalaire). J'ai jonglé un peu en remplaçant les "$" par des
"@" ou par des "@{$", ou en remplaçant
"$traductions{$mot}=($traductions{$mot}, @mots_droite);" par
"$traductions{$mot}=($traductions{$mot}, \@mots_droite);" (en adaptant
des exemples trouvés sur le web), mais ça ne marche pas (au mieux, si
je mets l'argument du print entre crochets, ça m'imprime des
ARRAY(0x806cc30): comme ça ressemble à un pointeur sur un tableau,
j'essaie de lui demander le n-ième élément en le fournissant entre
crochets, mais ça ne donne rien.)


--
`cat ~/.signature`

3 réponses

Avatar
Denis -esp2008-
Bonjour,


$traductions{$mot}=@mots_droite;


Tu évalues @mots_droite dans un contexte scalaire ($...=@...), donc c'est
le nombre d'éléments du tableau qui t'es retourné.

Bonne chance,

--
Denis

Avatar
Denis -esp2008-
Bonsoir,

$traductions{$mot}=@mots_droite;
Tu évalues @mots_droite dans un contexte scalaire ($...=@...), donc c'est

le nombre d'éléments du tableau qui t'es retourné.


Ce n'est pas une réponse totale, j'aurais dû ajouter un "regarde
`perldoc perllol`" (ou plus prosaïquement "rtfm"). En gros, on devrait
des lignes ressemblant à ça dans le code:

@traductions{$mot} = [@mots_droite];
print @{$traductions{$mot}};


Bonne chance,

--
Denis


Avatar
Jogo
Salut,

AMHA, il faut utiliser des références sur des tableaux, le plus proprement
possible. voir perlref, bien sûr.

Personnelement voilà comment je vois les choses :

if (!defined($traductions{$mot}))
{
$traductions{$mot}=@mots_droite;


Explicite ta référence :
$traductions{$mots} = [ @mots_droite ] ;

}else{
$traductions{$mot}=($traductions{$mot}, @mots_droite);


Utilise push :
push @{$traduction{$mots}} , @mots_droite ;

}
print $traductions{$mot};


Utilise join :
print join(', ',@{$traductions{$mots}}) ;