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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/>
bonjour,
À (at) Thu, 26 Mar 2009 14:41:30 +0100,
gerbier <eric_nospam_gerbier@meteo.fr.invalid> 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/>
À (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/>
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 ?
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