Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tie /untie

2 réponses
Avatar
gerbier
bonjour

j'ai un code ou je veux séparer les fonctions d'ouverture et de
fermeture de hashage liés à une base (berkeley ou autre ANY_File)

###############################################################
sub open_db() {
my $base = 'ma_base';

my %hash;
if ( -f $base) {
# ouverture en lecture
tie %hash, 'GDBM_File', 'ma_base', O_RDONLY, 0640;
print "lecture\n";
}else {
# ouverture en ecriture
tie %hash, 'GDBM_File', 'ma_base', O_RDWR | O_CREAT, 0640;
print "ouverture\n";

}
return tied %hash;
}

my $object = open_db();
$object->STORE('clef1', 'val1');

# clore la base ?
#############################################################

j'ai un probleme pour fermer la base : untie s'applique au tableau de
hashage (que je n'ai plus), alors que je voudrais une methode sur
$object. comment faire ?

2 réponses

Avatar
Thomas vO
bonjour,

À (at) Thu, 26 Mar 2009 14:41:30 +0100,
gerbier nous disait (told us):
j'ai un code ou je veux séparer les fonctions d'ouverture et de
fermeture de hashage liés à une base (berkeley ou autre ANY_File)

j'ai un probleme pour fermer la base : untie s'applique au tableau de
hashage (que je n'ai plus), alors que je voudrais une methode sur
$object. comment faire ?



je dirai bien d'utiliser une référence ; le code modifié (bêtement et
méchamment, et sans tester en plus...) :

###############################################################
my $hashref = {};
sub open_db() {
my $base = 'ma_base';
if ( -f $base) {
# ouverture en lecture
tie %{$hashref}, 'GDBM_File', 'ma_base', O_RDONLY, 0640;
print "lecturen";
}else {
# ouverture en ecriture
tie %{$hashref}, 'GDBM_File', 'ma_base', O_RDWR | O_CREAT, 0640;
print "ouverturen";
}
return tied %{$hashref};
}
open_db();
$hashref->STORE('clef1', 'val1');
# clore la base ?
#############################################################

mais le plus propre serait certainement de faire du "vrai" objet... et
on pourrait alors faire des trucs du genre :

my $object = Quelque::Chose->new();
$object->open_db;
$object->store(clef, val);

ce que des modules doivent proposer, j'imagine (cf. CPAN)...

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>
Avatar
gerbier
gerbier wrote:
bonjour

j'ai un code ou je veux séparer les fonctions d'ouverture et de
fermeture de hashage liés à une base (berkeley ou autre ANY_File)

###############################################################
sub open_db() {
my $base = 'ma_base';

my %hash;
if ( -f $base) {
# ouverture en lecture
tie %hash, 'GDBM_File', 'ma_base', O_RDONLY, 0640;
print "lecturen";
}else {
# ouverture en ecriture
tie %hash, 'GDBM_File', 'ma_base', O_RDWR | O_CREAT, 0640;
print "ouverturen";

}
return tied %hash;
}

my $object = open_db();
$object->STORE('clef1', 'val1');

# clore la base ?



selon perldoc -f tie, la classe lié doit implementer une liste de
methode : FETCH STORE ... UNTIE

j'ai donc essayé $object->UNTIE()
mais j'obtient l'erreur suivante : UNTIE is not a valid GDBM_File macro


un probleme de documentation ?