On 8/14/07, Mr. Shawn H. Corey <[EMAIL PROTECTED]> wrote:
> Chas Owens wrote:
> > On 8/14/07, DJ Gruby <[EMAIL PROTECTED]> wrote:
> >> Hello there!
> >>
> >> Have question if that is possible to empty a few arrays with one simple
> >> command?
> >>
> >> For the moment I clear these six tables by assigning them an empty list:
> >>
> >> @bitmap_addr_lo = ();
> >> @bitmap_addr_hi = ();
> >> @screen_addr_lo = ();
> >> @screen_addr_hi = ();
> >> @colors_addr_lo = ();
> >> @colors_addr_hi = ();
> >>
> >> Just wondering if there is a more elegant way to achieve the same result?
> >>
> >> Many thanks in advance for your help!
> >>
> >> Regards,
> >> DJ Gruby.
> >
> > The desire to empty arrays is a bad sign. It generally means you do
> > not have them declared with the correct scope, but, assuming you have
> > a good reason, there are many ways to reset a bunch of arrays. Here
> > are two in addition to your straight forward way.
> >
> > @bitmap_addr_lo = @bitmap_addr_hi = @screen_addr_lo = @screen_addr_hi
> > = @colors_addr_lo = @colors_addr_hi = ();
> >
> > @$_ = () for \(@bitmap_addr_lo, @bitmap_addr_hi, @screen_addr_lo,
> > @screen_addr_hi, @colors_addr_lo, @colors_addr_hi);
> >
> > Frankly, I think the straight forward way is more readable since I
> > dislike lines longer than 78 characters. But, given the names of the
> > arrays and the fact that they are all being reset at the same time I
> > think you are using the wrong data structure. You should be using an
> > HoHoA (a hash of hashes of arrays): $addr{screen}{hi} instead of
> > @screen_addr_hi.
> >
> > Then you could clear them all by saying
> >
> > for my $type (qw<screen bitmap colors>) {
> > for my $loc (qw<hi low>) {
> > $addr{$type}{$loc} = [];
> > }
> > }
> >
> > or (my favorite)
> >
> > @{$_}{qw<hi low>} = ([], []) for @addr{qw<screen bitmap colors>};
> >
> > or the more comprehensive (but dangerous if other keys are being used)
> >
> > for my $type (keys %addr) {
> > @$_ for keys %$type;
> > }
> >
>
> Or simply:
>
> %addr = ();
If you can do that safely then it would almost certainly be better
%addr if simply went out of scope. It is a complete destruction of
the data structure (as opposed to the emptying of a part of it).
Autovivification can save you from some problems, but not all of them:
#!/usr/bin/perl
use strict;
use warnings;
my %addr = (
screen => {
low => [0,1,2],
high => [0,1,2],
},
bitmap => {
low => [0,1,2],
high => [0,1,2],
},
colors => {
low => [0,1,2],
high => [0,1,2],
}
);
print "there are " . @{$addr{screen}{low}} .
" items in the low screen address\n";
@{$_}{qw<hi low>} = ([], []) for @addr{qw<screen bitmap colors>};
print "there are " . @{$addr{screen}{low}} .
" items in the low screen address\n";
%addr = ();
print "there are " . @{$addr{screen}{low}} .
" items in the low screen address\n";
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/