プロが教えるわが家の防犯対策術!

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

お世話になります。
配列の出力部で以下のエラーが出力されます。
Use of uninitialized value in print at test2.pl line 12.

-----コーディングは以下の通りです。-----
#!C:\perl

use strict;
use warnings;

my @l = ();

#-----------
#GetDataへCSVファイル名と、格納用配列を渡す
#-----------
my $cnt = &GetData("test.csv", \@l);

print "COUNT -> ".$cnt;

for(my $i=0; $i < $cnt; $i++){
print $l[$i];
}

##################################################################
# 概   要:指定したCSVファイルをオープンしCSVデータを配列に取得する。
# パラメータ:ファイル名, CSVデータ格納用配列
# 戻 り 値:データ取得件数
##################################################################
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;
}
-----実行結果は以下の通りです。-----
D:\>perl test.pl
FILE NAME -> test.csv
FILE OPEN -> success.
CSV GET COUNT -> 5
Use of uninitialized value in print at test2.pl line 12.
Use of uninitialized value in print at test2.pl line 12.
Use of uninitialized value in print at test2.pl line 12.
Use of uninitialized value in print at test2.pl line 12.
COUNT -> 5
-----CSVファイルの内容は以下の通りです。(ファイル名:test.csv)-----
あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの

配列の要素数が取れているので、配列内にデータは格納されているとは思っています。
出力方法をどのように正せばよいがご教示お願い致します。

A 回答 (2件)

あ~.... 「参照がスカラー」というのは (その通りとはいえ) この文脈では適切じゃないなぁ. 訂正するためちょっと詳しく書いてみよう.


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

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でのポインタの扱い方について勉強します…。
ありがとうございました!!

お礼日時:2010/07/26 14:32

「出力方法の問題」じゃない.


参照がスカラーだという事実を忘れている.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!