on an array it only undefines the value of an element
Actually, it does a bit more than "only" undefining the value. I'm not sure how useful this behavior is, but it's not quite the same as simply setting the value to undef. Here's a code snippet that demonstrates:
$ perl -MData::Dumper -le ' @array = (1 .. 3); delete $array; print Dumper \@array; delete $array; print Dumper \@array;'
When run, it outputs the following:
$VAR1 = [ 1, undef, 3 ]; $VAR1 = [ 1 ];
We see that the first delete call does indeed appear to simply set the value to undef, but when we delete again, it demonstrates the difference.
Update: betterworld beat me to it, by a pretty large margin. That'll teach me not to reload before replying. :-)