perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Torsten Foertsch <torsten.foert...@gmx.net>
Subject Re: [MP2] possible pnotes bug?
Date Fri, 09 Jun 2006 16:36:04 GMT
On Friday 09 June 2006 17:48, Geoffrey Young wrote:
> Geoffrey Young wrote:
> > I didn't realize there was a difference between this (preferred for eons)
> > syntax and the tied (essentially deprecated, never suggested on list)
> > syntax.  that there is a difference constitutes a bug in and of itself.
>
> and just to make sure I wasn't making things up
>
> modperl-docs$ grep -r 'pnotes->{' * |grep -v svn|grep -v dst_html|wc -l
> 4
>
> modperl-docs$ grep -r 'pnotes(' * |grep -v svn|grep -v dst_html|wc -l
> 28
>
> that's mp1 and mp2 docs, and all 4 of those tied references are from the
> documentation explaing the thing we're talking about, so they don't count
> :)

This is said in the description of pnotes:

   $hash_ref = $r->pnotes();
   ...
   if no arguments are passed, a hash reference is returned, which can then be
   directly accessed without going through the "pnotes()" interface.

Since a hash reference is returned it is clear that it is accessed as 
pnotes->{key}.

Btw, this description does not mention a tied hash. Maybe because it is in 
fact not tied. It is a normal perl hash only hidden in the C layer.

I think the behavior of $r->pnotes(key=>value) is buggy not because I want 
something special. I want it to behave simply like an ordinary perl hash.

Further I really think it is buggy because it leads to very difficult 
traceable bugs in applications using it. The docs says:

         $r->pnotes(foo => [1..5]);
         $val = $r->pnotes("foo");

If this example is changed into:

         $var=[1..5];
         $r->pnotes(foo => $var);

         $var=[’a’..’c’];    # this changes the pnote behind the scene

         $val = $r->pnotes("foo");

What would you expect $val to be? [1..5] or [’a’..’c’]?

I think every new programmer and even almost all experienced mod_perl users 
would say it is [1..5].

And it would be true if the code is changed to:

         $var=[1..5];
         $r->pnotes->{foo} = $var;

         $var=[’a’..’c’];

         $val = $r->pnotes("foo");

Torsten

Mime
View raw message