Phil Lobbes wrote:
> Software versions:
> mod_perl-1.99_12-2
> perl-5.8.3-17.5.legacy
> httpd-2.0.51-1.10.legacy
> Fedora Core 1 (kernel 2.4.22-1.2199.8.legacy.nptl)
>
> I have a custom application running under Apache::Registry w/mod_perl
> using strict and warnings everywhere.
>
> I have run into a case where sometimes a subroutine variable declared
> with my() inside an OO method retains its value somehow(!?!). I think I
> must be going crazy. The code looks like this:
>
> sub validate {
> my $app = shift;
> my $custid = $app->get_session_var('id') || "";
> my $sub_rec = $app->get_subscriber_rec($custid) if($custid);
> my $uid_int = $sub_rec->{'uid_int'} if($sub_rec);
Don't do that. It's doing exactly what you're asking it to since 'my' has both
compile time and run time effects. The $sub_rec and $uid_int vars are created
local to that sub at compile time. At run time their values are set depending on
your conditional. Since $sub_rec is false the second time the value is never
reset.
It's actually a deprecated poor-man's static variable technique. Perl 5.10
should have real static variables. I make it a rule to never do conditional
declaration to avoid just this problem.
my $cust_id = $app->get_session_var('id') || "";
my ($sub_rec, $uid_int);
$sub_rec = $app->get_subscriber_rec($custid) if($custid);
$uid_int = $sub_rec->{'uid_int'} if($sub_rec);
--
Michael Peters
Developer
Plus Three, LP