On Fri, Jun 23, 2006 at 11:33:42AM +0200, Philippe Lang wrote:
> Am I missing something maybe? It sounds like a bug with lexical variables to me...
I think what's happening is that sub init is created once with $val
referencing the lexically-scoped $val from sub foo's first invocation.
When you call foo again, foo creates a new lexically-scoped $val
but init's $val still refers to the object from foo's first call.
You can see this if you display \$val:
CREATE OR REPLACE FUNCTION foo() RETURNS void AS $$
my $val;
sub init {
$val = $_[0];
elog(NOTICE, "1: $_[0] " . \$val);
}
init(12);
elog(NOTICE, "2: $val " . \$val);
$$ LANGUAGE plperl;
SELECT foo();
NOTICE: 1: 12 SCALAR(0x8447220)
NOTICE: 2: 12 SCALAR(0x8447220)
foo
-----
(1 row)
SELECT foo();
NOTICE: 1: 12 SCALAR(0x8447220)
NOTICE: 2: SCALAR(0x83f5c4c)
foo
-----
(1 row)
This behavior isn't specific to PL/Perl. A standalone Perl program
exhibits the same behavior, so you might find a better explanation
in a Perl-specific forum like the comp.lang.perl.misc newsgroup.
--
Michael Fuhr