OVH Cloud OVH Cloud

valeurs par défut pour un hash

4 réponses
Avatar
kurtz_le_pirate
bonjour,

si, par exemple, j'ai un hash défini comme ça :
my %EventTypes = (1,'Error',2,'Warning',4,'Information',8,'Audit
Success',16,'Audit Failure');

existe-t-il un moyen de "definir" un valeur "autre" pour toutes clés
non définies ?
... otherwise,'inconnu'

votre avis ?


--
klp

4 réponses

Avatar
espie
In article <45221f3f$0$368$,
kurtz_le_pirate wrote:
bonjour,

si, par exemple, j'ai un hash défini comme ça :
my %EventTypes = (1,'Error',2,'Warning',4,'Information',8,'Audit
Success',16,'Audit Failure');

existe-t-il un moyen de "definir" un valeur "autre" pour toutes clés
non définies ?
... otherwise,'inconnu'

votre avis ?



Non, il faut un bout de code pour ca.

Attention a faire la distinction entre `exists' (il y a un element a
ce nom dans le hash, meme si sa valeur est non definie) et `defined'
(il y a un element a ce nom dans le hash de valeur definie), et a
utiliser `delete' en consequence.

S'il s'agit d'utiliser une substitution dans une regexp, une fonction
auxiliaire peut aider, par exemple:


my $f = sub {
return $EventTypes{shift} or "default value";
};

s/(...)/&$f($1)/eg;

Avatar
Paul Gaborit
À (at) Tue, 3 Oct 2006 08:43:33 +0000 (UTC),
(Marc Espie) écrivait (wrote):
In article <45221f3f$0$368$,
kurtz_le_pirate wrote:
bonjour,

si, par exemple, j'ai un hash défini comme ça :
my %EventTypes = (1,'Error',2,'Warning',4,'Information',8,'Audit
Success',16,'Audit Failure');

existe-t-il un moyen de "definir" un valeur "autre" pour toutes clés
non définies ?
... otherwise,'inconnu'

votre avis ?



Non, il faut un bout de code pour ca.

Attention a faire la distinction entre `exists' (il y a un element a
ce nom dans le hash, meme si sa valeur est non definie) et `defined'
(il y a un element a ce nom dans le hash de valeur definie), et a
utiliser `delete' en consequence.

S'il s'agit d'utiliser une substitution dans une regexp, une fonction
auxiliaire peut aider, par exemple:


my $f = sub {
return $EventTypes{shift} or "default value";
};

s/(...)/&$f($1)/eg;


Ça me semble aussi la meilleure solution pour un besoin ponctuel.

Si le besoin est récurrent (pour de nombreuses tables ou dans un
module), on peut aussi passer par 'tie' pour changer directement le
comportement de la table de hachage (cf. perltie).

Il existe un module sur CPAN qui s'appelle Tie::HashDefaults. Il ne
fait pas exactement ce que vous souhaitez mais il ne serait pas très
difficile d'y ajouter votre fonctionnalité. Et l'auteur du module
pourrait même l'intégrer dans une nouvelle version.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Klaus
Marc Espie wrote:
In article <45221f3f$0$368$,
kurtz_le_pirate wrote:
bonjour,

si, par exemple, j'ai un hash défini comme ça :
my %EventTypes = (1,'Error',2,'Warning',4,'Information',8,'Audit
Success',16,'Audit Failure');

existe-t-il un moyen de "definir" un valeur "autre" pour toutes clés
non définies ?
... otherwise,'inconnu'

votre avis ?



Non, il faut un bout de code pour ca.


Je propose de lier ce bout de code à un hash avec la méthode "tie":
http://perl.enstimac.fr/DocFr/perltie.html


Avatar
kurtz_le_pirate
"Marc Espie" a écrit dans le message de news:
eft7rl$2k7u$
In article <45221f3f$0$368$,
kurtz_le_pirate wrote:
bonjour,

si, par exemple, j'ai un hash défini comme ça :
my %EventTypes = (1,'Error',2,'Warning',4,'Information',8,'Audit
Success',16,'Audit Failure');

existe-t-il un moyen de "definir" un valeur "autre" pour toutes clés
non définies ?
... otherwise,'inconnu'

votre avis ?



Non, il faut un bout de code pour ca.

Attention a faire la distinction entre `exists' (il y a un element a
ce nom dans le hash, meme si sa valeur est non definie) et `defined'
(il y a un element a ce nom dans le hash de valeur definie), et a
utiliser `delete' en consequence.

S'il s'agit d'utiliser une substitution dans une regexp, une
fonction
auxiliaire peut aider, par exemple:


my $f = sub {
return $EventTypes{shift} or "default value";
};

s/(...)/&$f($1)/eg;


merci de ta réponse qui m'a fait avancer. j'ai un peu aménager tout ça
pour arriver à :
...
my %EventTypes = (1,'Error',2,'Warning',4,'Information',8,'Audit
Success',16,'Audit Failure');
...
# --- test loop
for ($index=0;$index<50;$index++) {
$alea=int(1+rand(18));
$val = getHashValue($alea);
print "$alea -> $valn";
}
...
sub getHashValue {
my $thisKey=shift;
return (defined
$EventTypes{$thisKey})?$EventTypes{$thisKey}:"inconnue";
}

merci :))