Random_Walk has asked for the wisdom of the Perl Monks concerning the following question:
I was just playing around with Memoize::Expire and did a one line test. It worked as expected when I use "print f().$/" but does not expire the memoized function f() when I use "say f();"
perl -MMemoize -MMemoize::Expire -E "sub f {int rand 100}; tie my %cache => 'Memoize::Expire',LIFETIME=>2; memoize 'f',SCALAR_CACHE => [HASH => \%cache ]; for (1..10) {print f().$/; sleep 1}" 16 16 95 95 61 61 62 62 93 93 perl -MMemoize -MMemoize::Expire -E "sub f {int rand 100}; tie my %cache => 'Memoize::Expire',LIFETIME=>2; memoize 'f',SCALAR_CACHE => [HASH => \%cache ]; for (1..10) {say f(); sleep 1}" 89 89 89 89 89 89 89 89 89 89
After a bit of tracking down I found it only works when the function is called in scalar context. For instance say f()+0; works fine.
I tried altering my invocation of memoize to use LIST_CACHE rather than SCALAR_CACHE but then it crashes
Can't use string ("ARRAY(0x9c7494)") as an ARRAY ref while "strict refs" in use at C:/Perl516/lib/Memoize.pm line 258.Does anyone know if Memoize::Expire can be got to work in list context? Or do I have to roll my own if I need that
Cheers,
R.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Memoize::Expire oddity
by McA (Priest) on Aug 14, 2013 at 15:47 UTC | |
|
Re: Memoize::Expire oddity
by ryanc (Monk) on Aug 15, 2013 at 17:51 UTC | |
by Random_Walk (Prior) on Aug 15, 2013 at 23:17 UTC | |
by ryanc (Monk) on Aug 16, 2013 at 18:32 UTC | |
by Yary (Pilgrim) on Aug 29, 2013 at 15:18 UTC | |
by ryanc (Monk) on Aug 29, 2013 at 18:36 UTC | |
|