[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]
arrays: delete()/exists() + possible keys()/values()
On Thu, Jan 13, 2000 at 04:08:15PM -0700, "Tom Christiansen" wrote:
> >Ever considered that your little diagrams before were _WRONG_? There are
> >no undef()'s in @array[3..49]... they just act like undef() when they are
> >needed.
> I reject that view.  If I cannot distinguish between these conditions,
> they are not different.  And if I can distinguish, you've introduced
> painfully subtle complexity that we don't need.
> --tom
Think:
         %a = ('ABC' => undef);
         print "ABC defined\n"   if defined($a{'ABC'});
         print "DEF defined\n"   if defined($a{'DEF'});
         @a = (undef);
         print "[0] defined\n"   if defined($a[0]);
         print "[1] defined\n"   if defined($a[1]);
Now exists():
         %a = ('ABC' => undef);
         print "ABC exists\n"    if exists($a{'ABC'});
         print "DEF exists\n"    if exists($a{'DEF'});
         @a = (undef);
         print "[0] exists\n"    if exists($a[0]);
         print "[1] exists\n"    if exists($a[1]);
And then with delete()?      
         %a = ('ABC' => undef);  delete $a{'ABC'};
         print "ABC exists\n"    if exists($a{'ABC'});
         print "DEF exists\n"    if exists($a{'DEF'});
         @a = (undef);           delete $a[0];
         print "[0] exists\n"    if exists($a[0]);
         print "[1] exists\n"    if exists($a[1]);
The ONLY thing "unexpected-like" is the fact that scalar(@a)/$#a are
affected if $a[N] represents the last initialized value in an array.
However, I don't see any code "breaking" as a result of this... The
end-of-array indicator has always been much looser than most people
ever realized. This is more of a wakeup call than anything. Especially
to those drawing incorrect diagrams to the masses and spreading
falsehoods in an effort to more easily express language concepts.
Personally, I sort of like Larry's suggested:
         scalar(keys(%hash))    vs    scalar(keys(@array))
With the added benefit that scalar(keys(@array)) would not return
the last element in the array like people assumed $#array to do (wrongly).
    scalar(keys(@array))
    =
    do {
        my $keys = 0;
        my $i;
        for ($i = 0; $i < @array; $i++) {
            $keys++ if exists $array[$i];
        }
        $keys;
    };
So:
    my @a;
    $a[100] = 1;
    print "$#a\n";                    # Prints 100
    print scalar(@a), "\n";           # Prints 101
    print scalar(keys(@a)), "\n";     # Prints "1"
And here's the kicker:
    my @a;
    $a[5] = 2;
    $a[7] = 3;
    print join(" ", keys(@a)), "\n";  # Prints "5 7"
    print join(" ", values(@a)), "\n";# Prints "2 3"
Tell me that isn't beautiful... :-) Well I know some people will... but
others will appreciate the complete elegance...
Let's see... what were the other operators? each()?
    my @a;
    $a[5] = 2;
    $a[7] = 3;
    while (($k, $v) = each @a) {
        print "\$a[$k] = $v;\n";
    }
Would Print:
    $a[5] = 2;
    $a[7] = 3;
Comone Tom... beauty? art? Haha...
Your happy camper,
mark
-- 
markm@nortelnetworks.com/mark@mielke.cc/markm@ncf.ca __________________________
.  .  _  ._  . .   .__    .  . ._. .__ .   . . .__  | Neighbourhood Coder
|\/| |_| |_| |/    |_     |\/|  |  |_  |   |/  |_   |
|  | | | | \ | \   |__ .  |  | .|. |__ |__ | \ |__  | Ottawa, Ontario, Canada
  One ring to rule them all, one ring to find them, one ring to bring them all
                       and in the darkness bind them...
                           http://mark.mielke.cc/
- Follow-Ups from:
 - 
Larry Wall <larry@wall.org>
Chip Turner <chip@zfx.com>
 
- References to:
 - 
Tom Christiansen <tchrist@chthon.perl.com>
 
[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]