Bobby wrote:
> 
> Here's a better excerpt of the script, see my comment towards the bottom. 
> Thanks. 
> 
> #!/usr/local/bin/perl
> 
> use strict;

Always

  use warnings;

as well, unless you know exactly what it does and have a good reason not to.

> open(IN, $ARGV[0]) || die "Could not open data file: $ARGV[0]\n";

If you are reading from files specified on the command line, then it is much
easier to simply read from the ARGV file handle.

> my %US;
> my %EURO;
> my %ITAL;
> my %GENERAL;

It is most common to reserve upper case for constant names and lower case for
variable names.

> my $DEBUG = 0;

use constant DEBUG => 0;

> # map each store to its children stores
> while (<IN>)
> {
>     my $line = $_;

while (my $line = <ARGV>) {

>     # split rows into columns
>     my @fields = split /\|/, $line;

  my ($sku, $item_size, $standard_size, $size_type, $us_sizes) =
      @fields[0, 19, 36, 37, 38];

>     if($DEBUG) {
>         print "$line\n";
>         print "SKU:".$fields[0]."\n";
>         print "  item_size ".$fields[19]."\n";
>         print "  standard_size ".$fields[36]."\n";
>         print "  us_sizes ".$fields[37]."\n";
>         print "  us_sizes ".$fields[38]."\n";
>     }

  if (DEBUG) {
print <<FIELDS;
SKU:$sku
  item_size $item_size
  standard_size $standard_size
  us_sizes $size_type
  us_sizes $us_sizes
FIELDS
  }

(I guess the 'us_sizes' label is wrong in the first instance?)

>     # make sure base number field is numeric
>     if($fields[0] =~ /^[0-9]{5}/) {

That test checks whether $fields[0] starts with at least five decimal digits. A
value of '00000ABC??' will pass the test.

To make sure $sku is numeric, you can write

  unless ($sku =~ /\D/) {
    :
  }

>         # save the important fields
>         my $sku = $fields[0];
>         my $item_size = $fields[19];
>         my $standard_size = $fields[36];
>         my $size_type = $fields[37];
>         my $us_sizes  = $fields[38];

Already done.

>         next if($item_size eq ""); #if item size is note specified, skip it.

  next unless $item_size;

(unless you're expecting an item size of zero?)

>         # push each store into array associated with its parent store
>         if($size_type eq "") {
>             $US{$item_size} = 1;
>         }
>         elsif($size_type eq "Euro") {
>             $EURO{$standard_size} = 1;
>             $EURO{$sku} => $sku;
>         }
>         elsif($size_type eq "Italian") {
>             $ITAL{$standard_size} = 1;
>         }
>         elsif($size_type eq "General") {
>             $GENERAL{$standard_size} = 1;
>         }
>         if($us_sizes ne "") {
>             $us_sizes =~ s/^,?(.*),?$/\1/g;
>             foreach my $size (split /,/, $us_sizes) {
>                 #print "pushing found US size $size\n";
>                 $US{$size} = 1;
>             }
>                                 
>         }

I don't want to try to guess what you're doing here. The PID of your previous
posts has vanished, and you are populating one of several hashes according to
the value of a single input field, leaving the others hashes empty I am fairly
certain that you need to draw all the data into a single hash, with the value of
a field called SIZE_TYPE indicating how the rest of the fields are to be
interpreted and processed.

>     }
> 
> }
> close(IN);

In general there's no need to close input files unless you have more than a
couple of them. If you're reading only from ARGV then

[snip subroutines]


I hope this helps.

Rob

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


Reply via email to