Perl Глобальная переменная неинициализирована - PullRequest
0 голосов
/ 02 февраля 2012

Я новичок в Perl, поэтому, пожалуйста, потерпите меня.

У меня есть скрипт, который анализирует файл CSV.Чтобы упростить отладку, я использую конечный автомат FSA :: Rules (прекрасно работает, обожаю его).

Все идет хорошо, только теперь мне нужно, чтобы мои журналы имели смысл, в рамках этого мне нужно записывать номера строк, чтобы моя программа выглядела примерно так.

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 ++;
}

Но я получаю следующую ошибку

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

Кто-нибудь знает, почему $ line не будет инициализирован?Спасибо.

1 Ответ

4 голосов
/ 02 февраля 2012

Когда вы достигнете конца файла, $line = <CSV> назначит неопределенное значение для $line.Обычная идиома состоит в том, чтобы проверить, вернула ли функция readline (которая неявно вызывается оператором <>) правильное значение или нет, прежде чем продолжить ...

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

но вы с вашей последовательностью вызовов,Вы избегаете этой проверки.Ваш текущий код также увеличивает $lineCount, даже если <CSV> не возвращает правильное значение, что может быть не тем, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...