From: Bobby <[EMAIL PROTECTED]>
> Hi,
> 
> I have a large pipe delimited text file that i want to loop through
> and sort out a column of data within that file. Let's call this column
> $sizes. I want to group these different sizes into categories. i.e. 
>
> @sizeA = ("A","B","C");
> @sizeB = ("D","E","F");
> @sizeC = ("G","H","I");

1. If you have several arrays (or hashes) that contain data in the 
same format and you need to do something with all of them, you should 
have them all in an array or hash. In this particular case a hash:

%size = (
  A => ["A","B","C"],
  B => ["D","E","F"],
  C => ["G","H","I"],
);

Now if you need to do something with all of them you can use

foreach my $array (values %size) {...}

or

while (my ($key, $array) = each %size) { ... }

Even if you do not know yet whether you'll need to do something with 
all of them, as soon as you have several variables named $something1, 
$something2, $something3, ... or $somethingA, $somethingB, 
$somethingC, ... you should stick all that data in an array or hash 
of somethings.

2. If you need to be able to find out easily and quickly whether 
something is in a set of values, use a hash, not an array. It's much 
quicker to ask whether

  exists $set{$key}
in a
  %set = (key1 => 1, key2 => 1, key3 => 1,...)
than whether
  grep {$_ eq $key} @set
in
  @set = (key1, key2, key3, ...)

If you already have the data in an array you can create the hash by

my %set = map {$_ => 1}, @list;

or

my %set, @[EMAIL PROTECTED] = ();

(In the first case you can use just
   if ($set{$key})
in the second you have to use the exists().)

In this case you do not actually want to go through all the groups 
and find out which one contains the key you are looking for. You want 
to find out what section maps the key to. So you'd better store the 
info like this:

%map = (
 A => 'A',
 B => 'A',
 C => 'A',
 D => 'B',
 E => 'B',
 F => 'B',
 G => 'C',
 H => 'C',
 I => 'C',
);

and then if you want to know what group does a letter belong to you 
just ask
  my $group = $map{$letter};

simple and as quick as it can get.


Choose the right datastructure and the code will become obvious.

Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to