On Oct 17, Aaron Petry said:

>I have 2 files.  One is an error log created from an import procedure to
>a database, the other is the text file that we were trying to import.
>The error log gives me back the line number that the record was on.  I
>need to cross reference this.  I'm thinking that this should be no big
>deal.  I'll read one file, parse it, and add the record/line # to an
>array.  Then, I'll loop through the other file, and when I get to a line
>that matches one in the array, I'll write the value to a text file.  The
>problem is that I can't get assign any values to my array. Why won't the
>following work?

You CAN assign them to the array.  You're just not checking properly.
You're always printing $records[0] (which is an empty string as you'll see
i a minute).

>my @records="";

You've just made your array hold one element, an empty string.  I think
you want

  my @records = ();

or just

  my @records;

>$llc = 1;  ### Set the log line count = 1;
>while(<LOG>){   ### Go through that log file line by line.
>  if($llc<10){  ### We're going to skip the first 10 lines here.  (Header Info)

$llc isn't needed.  We can use the builtin $. variable.

  if ($. < 10) { }

>  }
>  else {
>    if($_ =~ /Record#/){   ### Make sure that we're looking for the errors that we 
>want to see.

You could leave out the '$_ =~' part.

>      @line = split;                                  ### We're gonna split the line.
>      @records = (@records,$line[1]);                 ### Add the second part of this 
>line to @records

That is spelled push() in Perl:

  push @records, $line[1];

>      print "Adding $records[0] to the record list.\n";  ### Just a little diagnostic 
>tool.

You're printing the FIRST element of the array -- specifically, that pesky
empty string you put in it to begin with.  You probably wanted to say

  print "Adding $records[-1] to the record list.\n";

or just

  print "Adding $line[1] to the record list.\n";

although using $records[-1] ensures it got in there properly.

>               }   ### Close the if on line 20.
>       }    ### Close the if block on line 18 (else on line 19)
>$llc = $llc + 1;   ### Increment the line number.

That's spelled

  ++$llc;

and you don't need it anymore, since we use the $. variable.

>}  ### Close that while block up on 17.
>close(LOG);    ### Close the log file and free up some resources.

Here's how I'd write it:

  my @records;
  while (<LOG>) {
    next if $. < 10;
    push @records, (split)[1] if /Record#/;
  }

If you want to draw it out a bit, that's the same as:

  my @records;
  while (<LOG>) {
    if ($. < 10) { next; }
    if (/Record#/) {
      my @parts = split;
      push @records, $parts[1];
      # any debugging stuff here
    }
  }

-- 
Jeff "japhy" Pinyan      [EMAIL PROTECTED]      http://www.pobox.com/~japhy/
RPI Acacia brother #734   http://www.perlmonks.org/   http://www.cpan.org/
** Look for "Regular Expressions in Perl" published by Manning, in 2002 **
<stu> what does y/// stand for?  <tenderpuss> why, yansliterate of course.
[  I'm looking for programming work.  If you like my work, let me know.  ]


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to