Me revoila j'ai fait une classe qui fait la meme chose que Thread::Queue sauf que j'utilise un dbm en l'occurence le module DBM:eep, mais seulement voila j'ai un problème de référence
voici mon code
Quand j'invoque la fonction enqueue dans mon script de teste comme cela
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 package System::File::DBM; use threads::shared; use DBM::Deep; use Data::Dumper; use Compress::Zlib; # http://search.cpan.org/~rkinyon/DBM-Deep-0.983/lib/DBM/Deep.pm our @ISA = ("DBM::Deep"); sub new { my $class = shift; my $Qna = shift; my $db = $class->SUPER::new( file => $Qna->{'Store'}, filter_store_key => \&_compress, filter_store_value => \&_compress, filter_fetch_key => \&_decompress, filter_fetch_value => \&_decompress ); share(%$db); return bless \%$db, $class; } sub enqueue { my $db = shift; my $value = shift; my $key = shift; lock(%$db); if ( defined $key and ref($value) eq "HASH" || "ARRAY") { eval { $db->put($key, $value) and cond_signal %$db; }; if ($@) { warn "\nErreur fonction enqueue avec clef\n"; print $@; exit; } } else { if ( ref($value) eq "HASH" || "ARRAY" and exists $value->{'url'} ) { eval { $db->put($value->{'url'}, $value) and cond_signal %$db; }; if ($@) { warn "\nErreur fonction enqueue\n"; print $@; exit; } } } } sub dequeue { my $db = shift; my $temp = undef; lock(%$db); my $max = 5; cond_wait %$db until %$db; cond_signal %$db if [%$db] > 1; # vive les hack if ( [%$db] > 1 ) { eval { while ( my ($c, $v) = each(%$db) and $max > 0) { $temp->{$c} = $v if defined $c; $db->delete($c) if defined $c; } $db->optimize(); return $temp; }; if ($@) { warn "\nErreur dans la fonction dequeue\n"; print $@; exit; } } else { return {}; } } sub pending { my $db = shift; lock(%$db); return scalar keys %$db; } sub flush { my $db = shift; lock(%$db); $db->clear(); $db->optimize(); } sub optimize { my $db = shift; lock(%$db); $db->optimize(); } sub _compress { return Compress::Zlib::memGzip( $_[0] ) ; } sub _decompress { return Compress::Zlib::memGunzip( $_[0] ) ; } 1;
perl me renvoie l'erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #!/usr/bin/perl -w use strict; use diagnostics; use Data::Dumper; use System::File::DBM; my $i = new System::File::DBM ({ Store => 'db_compress.db' }); $i->enqueue( { url => 'http://www.free.fr', 'teste' => ['e', { 'm' => 55 }] } ); my $m = $i->dequeue(); print Dumper($m);
merci de votre aide a tousCan't locate object method "_get_self" via package "System::File:BM" at G:/Program Files/Perl/site/lib/DBM/Deep.pm line 1326.
Partager