Dan Walmsley
Dan Walmsley

Reputation: 2821

Perl Global variable uninitialized

I'm new to perl so please bear with me.

I have script that is parsing a CSV file. To make things easier to debug I am using a state machine FSA::Rules (works great love it).

Every thing is going well only now I need to make my logs make sense, as part of this I need to record line numbers so my program looks some thing like this.

my $line = '';
my $lineCount = 0;
sub do {
    ...
    #CSV opened 
    ...
    #State machine stuff happens here
    readLine;
     if ($line =~ m/.*Pattern*/){
         #do stuff
     }
}
sub readLine{
    $line = <CSV>;
    $lineCount ++;
}

But I get the following error

Use of uninitialized value $line in pattern match (m//) at

Any one know why $line would not be initialized? Thanks.

Upvotes: 0

Views: 498

Answers (1)

mob
mob

Reputation: 118595

When you reach end of file, $line = <CSV> will assign the undefined value to $line. The usual idiom is to check whether the readline function (which is implicitly called by the <> operator) returned a good value or not before proceeding ...

 while (my $line = <CSV>) {
     # guaranteed that $line has a defined value
     ...
 }

but you with your sequence of calls, you are avoiding that check. Your current code also increments $lineCount even when <CSV> does not return a good value, which may not be what you want either.

Upvotes: 4

Related Questions