<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)-----
あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの
配列の要素数が取れているので、配列内にデータは格納されているとは思っています。
出力方法をどのように正せばよいがご教示お願い致します。
No.2ベストアンサー
- 回答日時:
あ~.... 「参照がスカラー」というのは (その通りとはいえ) この文脈では適切じゃないなぁ. 訂正するためちょっと詳しく書いてみよう.
GetData で
my ($f, @bf) = @_;
と引数を受けているので, $f がファイル名になり, @bf は「配列に対する参照 \@l を唯一の引数とする配列」です. で, 本当なら split した結果はこの参照を通して代入しなきゃならないのに
@bf = split(/,/, <FP>);
と配列そのものに入れている. つまり, 引数で渡された参照は全く使っていない.
「配列の要素数が取れている」というのは, この「ローカルな配列 @bf」であり, メインの配列 @l の要素数を調べれば「@l にデータが入っていない」ことはわかるはず.
訂正方法はいくつかあるけど自然なのは「参照はスカラー」なので
my ($f, $bf) = @_;
と参照もスカラーで受けること. それ以降は現状 @bf となっているのを参照経由で @$bf とすればいい.
念のため, 「参照」についてものの本で再確認した方がいいかもしれません.
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でのポインタの扱い方について勉強します…。
ありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
perlで配列の要素が空なのを知...
-
二次元配列のインデックスについて
-
VB6で配列の最大値を簡単に求め...
-
クラスに配列を渡す方法
-
マクロ Publicでの配列定義
-
DataGridViewに配列の値を表示...
-
Dim flag(4) as boolean で配列...
-
リストボックスに縦スクロール...
-
二次元配列における要素数のは...
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
GIFアニメをループさせたくない
-
VB2010でCSVファイルの読み込み
-
ListBox 複数選択 で オートフ...
-
チェックデジットについて
-
Escキーを押すと、中断する時と...
-
範囲指定したセルを1つずつ飛...
-
Can't use string ("0") as an ...
-
短いハッシュの作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dim flag(4) as boolean で配列...
-
VBAのautofilter、criteriaの配...
-
二次元配列のインデックスについて
-
二次元配列における要素数のは...
-
エクセルVBAでTransposeの不思議
-
クラスに配列を渡す方法
-
リストボックスに縦スクロール...
-
マクロ Publicでの配列定義
-
Excel VBA ユーザーフォームの...
-
文字の整列(printf)
-
perlで配列の要素が空なのを知...
-
perl 配列の要素数について
-
Strawberry Perl for Windows ...
-
VBA 二次元配列の1つ目を増...
-
チェックボックスのperlでの値...
-
perl 初等プログラミングについて
-
DBIを使ってSelect文 複数のカ...
-
複数のキーで配列をソートする...
-
Excel(VBA)で配列の要素数を...
-
newで個別に生成した配列にNULL...
おすすめ情報