• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:<Perl>参照配列の出力に失敗する。)

<Perl>参照配列の出力に失敗する。

このQ&Aのポイント
  • <Perl>参照配列の出力に失敗する。
  • 配列の出力部でエラーが発生し、未初期化の値を出力しようとしています。
  • CSVファイルからデータを取得し、配列に格納する際にエラーが発生しているようです。正しい出力方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

あ~.... 「参照がスカラー」というのは (その通りとはいえ) この文脈では適切じゃないなぁ. 訂正するためちょっと詳しく書いてみよう. GetData で my ($f, @bf) = @_; と引数を受けているので, $f がファイル名になり, @bf は「配列に対する参照 \@l を唯一の引数とする配列」です. で, 本当なら split した結果はこの参照を通して代入しなきゃならないのに @bf = split(/,/, <FP>); と配列そのものに入れている. つまり, 引数で渡された参照は全く使っていない. 「配列の要素数が取れている」というのは, この「ローカルな配列 @bf」であり, メインの配列 @l の要素数を調べれば「@l にデータが入っていない」ことはわかるはず. 訂正方法はいくつかあるけど自然なのは「参照はスカラー」なので my ($f, $bf) = @_; と参照もスカラーで受けること. それ以降は現状 @bf となっているのを参照経由で @$bf とすればいい. 念のため, 「参照」についてものの本で再確認した方がいいかもしれません.

t-uduki
質問者

お礼

Tacosanさん、ご指摘と、ご教示あるがとうございます!! *危なく、1つ前のレスにお礼を書くところでした。。。 ご指摘通り、参照の扱い方が間違っていました。 修正後は以下の通りです。 sub GetData { my ($f, $bf) = @_; #←単純配列の記載から先頭アドレス取得用の単純変数に変更 my $rcnt = 0; print "FILE NAME -> ".$f."\n"; if ( open(FP, "<${f}") ){ print "FILE OPEN -> success.\n"; @{$bf} = split(/,/, <FP>); #←単純配列の記載から参照配列用に変更 close(FP); $rcnt = @{$bf}; #←単純配列の記載から参照配列用に変更 print "CSV GET COUNT -> ".$rcnt."\n"; } return $rcnt; } ------- もう少し、Perlでのポインタの扱い方について勉強します…。 ありがとうございました!!

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「出力方法の問題」じゃない. 参照がスカラーだという事実を忘れている.

関連するQ&A