hi,
danke ;
Wenn das ein Konsument deiner Klasse macht, ist das ein Programmierfehler und nicht anders zu sehen als
$i = C->new; $i = C->new;
. Dokumentiere dies unter einer Überschrift "Pitfalls", wenn du magst. AFAICS helfen Singletonmechanismen hier nicht. Vom gewaltsamen Herummurksen in den Eingeweiden von Perl zur Unterbindung dieses Fehlerfalls rate ich ab, die Risiken sind immer nicht absehbar und stehen nicht im Verhältnis zum Nutzen.
In meiner Frage gehts weniger um Perl (sorry), vielmehr um die Realisierung eines Transaktionskonzepts. Dieses Transaktionskonzept sieht vor, dass jeder Zugriff auf eine Repository (Datei) vom "Lesen bis zum Schreiben" ein in sich abgeschlossener Vorgang ist.
Somit darf ein zweites (oder jedes weitere) tie() innerhalb _einer_ main() auf die gleiche Datei nur lesenden Zugriff haben: wenn überhaupt(?) und genau das ist die Frage.
Konkret:
Der Konstruktor lädt die gewünschten Werte (hier sind es assoziierte Nummern) in den main()-Space like this:
tie my %h, 'Counter', {-file => $file, -incr => ['foo','bar'], -keys => ['baz']} or die $!;
$h{baz}++; # ok
$h{foo} = 99; # ok
$h{bar} = 'otto'; # carp, not a number
$h{hugo}++; # carp, key not predefined...
my $o = tied %h;
$o->hashdump;
Wobei die Numerics in '-incr' beim tie() um Eins erhöht werden, die Nummern in '-keys' jedoch nicht. Die Repository kann weitere Nummern enthalten, ein
$o->filedump;
gibt alles aus, was 'drin ist.
Ein zweites tie(*) innerhalb einer main() ist überflüssig (**), das Modul ist jedoch so konzipiert, dass damit zumindest kein DeadLock entsteht.
(*) auf die gleiche Datei
(**) aber möglich und nur lesender Zugriff
Die Frage noch einmal anders gestellt: Welcher Programmierer braucht innerhalb einer main() ein zweites tie() und wozu?
Hotti
Modul Source siehe Link, es tut so wie beschrieben.