Cache::Memcached - pos() weirdness

Brad Fitzpatrick
Sat, 17 Jul 2004 18:18:49 -0700 (PDT)

This is still hanging around my inbox, but I feel dirty applying it
without knowing the real problem.  (which I suspect is Perl's fault)

Dave:  can you test this one-liner instead:


my $p = pos($buf{$sock});


my $p = pos($buf{$sock}) || length($&);

That way it shouldn't slow down or otherwise affect anything except on
broken taint systems.

It also probably warrants a comment, which I can commit if the above works
for you.

- Brad

On Thu, 20 May 2004, Dave Evans wrote:

> A few times I've come across some rather odd behaviour in the Perl binding,
> Cache::Memcached.  Typically the following warning is emitted:
>   Use of uninitialized value in subtraction (-) at Cache/ line 494.
> which is this line:
>   my $copy = $len-$p > $state{$sock} ? $state{$sock} : $len-$p;
> The cause seems to be that pos() has returned "undef" - this in spite of the
> fact that the last m//g match was successful (just a few lines further up).
> "perldoc -f pos" tells us that undef() is returned if and only if the match
> failed.  So, I'm at a loss to explain what's going on.  I'd love to hear an
> explanation, if anyone has one.
> What I /can/ be sure about is that when it does happen, it causes problems,
> because effectively the whole response "VALUE key n n ..." is interpreted as the
> value from the cache.  Ooops.
> Because I have no idea why pos() is playing up, I modifed the code not to rely
> on pos() any more, which makes this problem go away (for me).  Patch attached.
> Thanks,
> --
> Dave Evans
> PGP key: