人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

pearl で use of uninitialized value エラーが出ます。最後の行の
print $filename[$x];のところです。なにが悪いのでしょうか。
use warnings;
$dpass='c:\\data\\';
#$count=0;
#$count2=0;
@ch_check = (1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
for ($x = 0; $x <= 15; $x++){
if ($ch_check[$x] == 1 ) {
if($x == 0){ $p_dat = 'CH1_*.log'; }
if($x == 1){ $p_dat = 'CH2_*.log'; }
if($x == 2){ $p_dat = 'CH3_*.log'; }
if($x == 3){ $p_dat = 'CH4_*.log'; }
if($x == 4){ $p_dat = 'CH5_*.log'; }
if($x == 5){ $p_dat = 'CH6_*.log'; }
if($x == 6){ $p_dat = 'CH7_*.log'; }
if($x == 7){ $p_dat = 'CH8_*.log'; }
if($x == 8){ $p_dat = 'CH9_*.log'; }
if($x == 9){ $p_dat = 'CH10_*.log'; }
if($x == 10){ $p_dat = 'CH11_*.log'; }
if($x == 11){ $p_dat = 'CH12_*.log'; }
if($x == 12){ $p_dat = 'CH13_*.log'; }
if($x == 13){ $p_dat = 'CH14_*.log'; }
if($x == 14){ $p_dat = 'CH15_*.log'; }
if($x == 15){ $p_dat = 'CH16_*.log'; }
$p2_dat = $dpass.$p_dat;
print $p2_dat;
$filename[$x] = glob $p2_dat;
}
else{
$filename[$x] = "no_file";
}
print $filename[$x];
# print \n;
}


●質問者: youkan_ni_ocha
●カテゴリ:コンピュータ 学習・教育
✍キーワード:print エラー
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● al001
●27ポイント

$filename[$x] = glob $p2_dat; の行にて $filename[$x]に何も代入されなかったにもかかわらず、

print $filename[$x]と$filename[$x]を出力しているためかと思います。

ためしにその行を$filename[$x] = "test";にしてみるとエラーは消えるかと。


原因はglob $p2_datにてファイルが見つからなかったことだと存じます。

ファイルが見つからなかったときも$filename[$x]に何か値を入れるか、

もしくはファイルが見つからなかったとき、つまり$filename[$x]に何も入っていなかったときは出力を控えるようにすれば解決するかと存じます。

$filename[$x] = glob $p2_dat;

の部分を以下のようにしたらどうでしょうか。

以下はファイルが見つからなかったとき$filename[$x]に"ファイル無いよ。"を代入するコードです。

if (my $result = glob $p2_dat) {
 $filename[$x] = $result; 
} else {
 $filename[$x] = "ファイル無いよ。";
}

もしくは

print $filename[$x];

print $filename[$x] if $filename[$x];

にすれば$filename[$x]に何も入っていないときは$filename[$x]が出力されないので、解決されるかと存じます。

URLはダミーですが、僕が愛用しているperlサイトのglobの説明です。

http://www.rfs.jp/sb/perl/05/glob.html

いちお差し替えコードは動作確認済みです。

◎質問者からの返答

回答ありがとうございます。ファイルが無いというご指摘ですが、ファイルはあります。で$filename[$x]を@filename[$x]という禁じ手を使うと、警告はでるものの、ファイルが表示されます。どーもよくわかりません。if***とやたらに続いてるのは *を使うと、いまいち挙動がおかしくなるようなので入れてあります。なんか気持ちわるいです。。、、どうも、根本的な問題のような気がします。


2 ● al001
●27ポイント

先ほど回答させていたコードを再度テストしましたが、手元ではきちんとファイルネームが表示されました。

テスト環境はWindows XP SP2、Active Perl 5.8.8。

C:\test.plに問題のコードを置き、C:\data以下にCH1_test.log、CH1_test2.logを配置しました。


解決方法を提示できておらず申し訳ないのですが、

ディレクトリ構造やOS、Perlのバージョンなどを教えていただけるとお力になれるかもしれません。

自分の環境で動いたので、globに突っ込んでる文字列に合致するファイルが無いことを疑ってます。(すみません。。)

CH1_test.logという名前のファイルを、C:\data\に作って再度ファイル名が表示されないか試していただけると幸いです。

http://google.com/

◎質問者からの返答

active perl 5.10.0.1002 xp home edition sp2だとおもいます。perlのバージョンが少し違うようですね。

プログラムは、デスクトップのマイドキュメント\perl_programにおいて、perlをはじめようという開発環境で実行しています。perlはデフォルトのディレクトリにあります。正式なファイル名はたとえばCH1_2008_4_10_T10_23_33.logというような長ったらしい名前です。globにファイル名がわたされるときに、なんらかの文字化けがおきるという可能性は否定できないかと思います。*が嫌というか、気になります。ファイル名を変える実験はのちほど


3 ● imo758
●26ポイント

このような場合、grob演算子の受け取りはリストにしておいた方が賢明です。つまり

$filename[$x] = glob $p2_dat;
↓
@filename[$x] = glob $p2_dat;

$filename[$x] = "no_file";
↓
@filename[$x] = ("no_file");

print $filename[$x];
↓
print @filename[$x];

となります。

グロブは新しいリストを開始するときにだけ、(埋め込まれた)引数を評価します。再び始めからやり直す前に、すべての値を読み終わっていなくてはなりません。grobを呼び出すたびに次の値が返され、読んでしまったら偽が1回だけ返されます。

しかしこれはスカラーコンテキストの場合のみで、リストコンテキストでは問題になりません。

◎質問者からの返答

連続してファイルを読み出したとき、エラーが1回おきにおきる理由がようやく理解できました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ