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/