[Dub-pm] hello
Fergal Daly
fergal at esatclear.ie
Fri Jul 23 17:59:18 CDT 2004
On Fri, Jul 23, 2004 at 08:15:55PM +0100, Aidan Kehoe wrote:
> my $certain_value = $sbh->selectall_arrayref->($sh, # [1]
> undef, $good_row_id);
> if (defined $certain_value && defined $certain_value->[0]->[0]) {
> $certain_value = $certain_value->[0]->[0];
> } else {
> $certain_value = 'default value';
> }
>
> Why did line [1] even compile? What does it mean, given that it did? "Call
> the result of selectall_arrayref with no arguments, and pass $sh, undef, and
> $good_row_id as _its_ argument list?" Selectall_arrayref returns a reference
> to an array, which, Jesus, should refuse to be called as a function. We're
> not assembler. Nor even buffer-overflow-inclined C.
It compiled because Perl is a dynamic language and Perl does not know in
advance that selectall_arrayref will not be returning a subroutine
reference. It's perfectly valid code for suitable values of $sbh.
> But, even more mad, looking back over the four months that major brain fart
> was running code, how in God's name did it sometimes Do The Right Thing?
> Because it did; looking back through the records for those four months,
> there's no other explanation for them than that it did--$certain_value ended
> up as the right, non 'default value' string perhaps one time in five that
> the code ran. Was there random reading of values off some conceptual stack?
That code should have died every time with an error like "Not a CODE
reference at blah blah".
Have you used eval anywhere in your code? That is the only reason I can
think of that the problem hasn't shown up sooner. If it was executing inside
an eval and you weren't checking $@ after the eval then that could hide the
fact that your code was dying.
> Can I turn on something stronger than -W to catch this shit in the future?
Beyond rewriting it all in a strongly-typed language like Haskell (or a
badly-typed language like Java) there is nothing you can do,
F
More information about the Dublin-pm
mailing list