2012-02-01 35 views
0

私はperlを使い慣れていますので、私にご負担ください。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 

次のエラーを取得しますか?おかげさまで

+0

これはエラーを生成するコードではありません。サブルーチン 'do'を呼び出すことは決してありません。サブルーチンには予約語と同じ名前を付けてはいけません。一つは、呼び出すのが非常に面倒です。失敗したコードを表示してください。 'sub $'の中に 'my $ line'をもう一度宣言しますか? – Borodin

+0

$ lineの内容が指定された正規表現と一致しないため、$ line変数は初期化されません。 #!の後ろに 'use strict;'と 'use warnings;'を追加した後、あなたのコードをすべて投稿してください。行(これはスクリプトの最初の行でなければなりません)。 –

+5

@David:すみません?変数が正規表現と一致しない場合、変数は初期化されません。そして、 '#!'行は必要ではなく、望ましくもありません(厳密と警告はありますが)! – Borodin

答えて

4

ファイルの最後に到達すると、$line = <CSV>$lineに未定義の値を割り当てます。通常のイディオムは...先に進む前に(暗黙のうちに<>オペレータによって呼び出される)readlineの機能が良い値を返されているか否か

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

をチェックすることですが、通話のあなたの順序で、あなたはそれを避けていますチェック。 <CSV>が適切な値を返さない場合でも、現在のコードは$lineCountをインクリメントします。

+2

perlのオプティマイザはwhileループを 'while(defined(my $ line = )){...}'に書き換えます。これは定義されたテストの出所です。ループは通常、真の値だけをテストします。 –

関連する問題