I was writing some code that involved accessing an array-of-arrays. I
wanted to check whether both of a given pair of indices were in bounds, so
I wrote:
return () if @array[$y]:!exists or @array[$y][$x]:!exists or ...
The double index check bugged me a bit, since I wondered if there might be
a shorter way to express it. Then I remembered nested arrays can be
accessed by separating the indices with semicolons, so I tried:
return () if @array[$y;$x]:!exists or ...
A whole bunch of errors ensued when I ran the program. I experimented some
more on the console and saw some pretty strange behavior.
> my @a = ,
[(a b c) (d e f)]
> my $i = -1
-1
> @a[$i;$i]:exists
False
(Indexing with $i instead of a literal -1 is necessary to get around the
fact that providing a negative literal as an array index is apparently a
compilation error, not a runtime error, meaning that @array[-1]:exists is a
syntax error, even though it looks like it should just evaluate to True.
That confused me for a little while.)
So anyway, that last evaluation appears correct, but if I repeat it over
and over, eventually I get this error:
WARNING: unhandled Failure detected in DESTROY. If you meant to ignore
it, you can mark it as handled by calling .Bool, .so, .not, or .defined
methods. The Failure was:
Index out of range. Is: -1, should be in 0..^Inf
in block at line 1
Actually, I get a bunch of those errors, as if they were stored up by all
my previous evaluations of @a[$i;$i]:exists. If I continue to evaluate the
expression repeatedly, I get a run of Falses, then another batch of errors
at some later point.
So this looks pretty buggy, but I wonder if I'm somehow invoking undefined
behavior by combining semicolons and adverbs while subscripting. The
online docs cover both features separately, but not in tandem that I can
see.