Tim McGeary wrote:
> 
> Greetings,

Hello,

> I am a new subscriber and I do know a little perl, but I am trying to
> pick up a lot more very quickly. I am having an issue with a conditional
> checking a regular expression
> that doesn't make sense and every book or online resource I have found
> shows the same syntax I have.
> 
> Script background:
> I have one file of 4 letter codes (e.g. PART, PBIO, PENG), one code per
> line.  I read this file into an array.
> 
> I have another file of pipe delimited data, in which one of these fields
> may include a code from the previous file or - for NULL.  This file is
> too large to read in all at once, so I am reading it in line by line.
> The problem I am having is with this section:

You should have warnings and strict enabled while developing your
program to help eliminate obvious mistakes.

use warnings;
use strict;


> while (<SIRSI>) {
>      $temp = $_;

while ( my $temp = <SIRSI> ) {


>      $counter = $counter + 1;
>      print "$counter \n";

if you just want the current line number of the file you could use the
$. variable.

       print "$.\n";


>      foreach $code (@fundcodes) {

       foreach my $code (@fundcodes) {


>         if ($temp =~ /$code/) {
>            print "$temp \n";
>            push(@fund_array, $temp);
>            last;
>         }
>      }
> }
> 
> @fundcodes is the array of codes read in from the first file

Did you chomp() the values of @fundcodes when you read them in?


> $counter is just for my debugging purposes.
> 
> The problem is that the code above thinks every line has $code in it.
> But when I hard-code PBIO instead of $code in the if conditional, I only
> get those files with PBIO.
> 
> Now, a secondary problem, which I also haven't figured out is how do I
> get only those lines that have a code between two pipes and not lines
> that also happen to have a code that can be used in a word (e.g. PART or
> PACT)?

Put the pipes in the regular expression:

          if ( $temp =~ /\|$code\|/ ) {


> Is there an easier way for me to do this?

Is the fundcode always in the same field?

You could do something like this:

# setup fundcode hash
my %fundcodes;
@fundcodes{ @fundcodes } = ();

while ( my $temp = <SIRSI> ) {
    print "$.\n";
    chomp;
    for my $field ( split /\|/, $temp ) {
        if ( exists $fundcodes{ $field } ) {
            print "$temp\n";
            push @fund_array, $temp;
            last;
        }
    }
}


John
-- 
use Perl;
program
fulfillment

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

Reply via email to