On Fri, Jan 13, 2006 at 10:33:23PM +0000, Luke Palmer wrote:
> In perl 5:
>
> my @a = (1,2,3);
> delete $a[1];
> print exists $a[1];
>
> This is false, whereas $a[0] and $a[2] do exist. This is creepy. Not
> only is it creepy, it raises a whole bunch of questions with
> nontrivial answers:
>
> * does [EMAIL PROTECTED] include nonexistent elements?
> * does map iterate over nonexistent elements?
> * how do you store nonexistence for native packed arrays
>
> And, what I always say, if the proper abstractions are being used,
> then all decisions become obvious truths. Since the answers to these
> are not obvious truths, proper abstractions must not be in use.
>
> Anyway, I want this behavior to die. Maybe we should get rid of
> .delete() on arrays, or maybe we should equate it with
> .splice($idx,1).
I'm not sure if it came in as a side effect of pseudohashes. Sadly I no
longer have access to the AIX box where I built perl 5.000, so I can't
check what really old perl 5 makes of it. I have this hunch that
using exists on an array element is not legal syntax.
I have this vague memory that there's an even weirder piece of emergent
behaviour with arrays and exists, but I can't remember what it is. Possibly
something to do with extending arrays, but checking the source for av_exists
I can't work out any way to make it do even stranger things. Maybe it was
just this:
#!perl -w
use strict;
sub check {
my $array = shift;
printf "%d:", scalar @$array;
foreach (0..9) {
print exists $array->[$_] ? " Y" : " n";
}
print "\n";
}
my @a;
check [EMAIL PROTECTED];
my @b = @a;
check [EMAIL PROTECTED];
$#a=5;
check [EMAIL PROTECTED];
@b = @a;
check [EMAIL PROTECTED];
__END__
0: n n n n n n n n n n
0: n n n n n n n n n n
6: n n n n n n n n n n
6: Y Y Y Y Y Y n n n n
Some undefs are more equal than others.
Nicholas Clark