電子書籍の厳選無料作品が豊富!

perl初心者です。
大量のデータファイルを自動的に同じ処理をかけたく、プログラムを書いています。
しかし、foreach内でUse of uninitialized value  というエラーが出てしまい動きません。
どうぞお知恵を貸していただければ幸いです。
どうぞよろしくお願いします。



+++++++++++++++++++++++++++++++++++++



・以下の処理の前に、あるディレクトリ内にある圧縮ファイルをglobで集め、
 @M_raw_data に入れてあります。

・ファイルネームが内容.拡張子となっています。
 この後で各ファイルの処理結果を"内容"が名前のディレクトリに格納させたいため、$dir_nameに入れようとしています。

・最後のprintですが、本当は、systemを使って
 コマンド 出力先ディレクトリ(”内容”) 処理したいファイル($Mm_file)
 とするつもりです。テストでprintとしています。


foreach my $M_file (@M_raw_data){


my @split_filename = undef;
my $dir_name = undef;

@split_filename = (/./,$M_file);
$dir_name = $split_filename[1];

print $M_file;
print $split_filename[1];
print $dir_name;

}


エラー:
Use of uninitialized value $_ in pattern match (m//) at プログラム名 line 28.
Use of uninitialized value in print at プログラム名 line 32.
Use of uninitialized value $dir_name in print at プログラム名 line 33.
で、それぞれ問題の行は
@split_filename = (/./,$Mm_file);
print $split_filename[1];
print $dir_name;
です。

質問者からの補足コメント

  • ご解説をありがとうございます!この場では . に対しエスケープが必要、ということで良いのでしょうか?お手数おかけしますが、お答えいただけると嬉しいです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/07/01 19:22

A 回答 (3件)

いや, エスケープしているかどうかの問題ではなく (もちろんエスケープしないと期待した動作にはならんけど)


/./ という正規表現を単独で書いたために $_ とのマッチングと解釈される
ことが問題なのです. 実際,
@split_filename = (/./,$Mm_file);
でエスケープして
@split_filename = (/\./,$Mm_file);
としたところで同じことになるはずですよ.

そういえば今ふと思ったんだけど, これって split する必要あるのかなぁ? あとでどうするのか知らんけど, 単純にファイル名がほしいだけなら s/// で対処する方が正統な感じがする.
    • good
    • 0
この回答へのお礼

ああ!大変しょうもないミスをしていました、お時間を割いていただき誠に申しわけありません…。
また、s///を使う発想がなかったもので、とても勉強になりました。本当に、どうもありがとうございました!

お礼日時:2016/07/03 17:59

「どう直せばいいか」は #1 の通りだけど, そうなる直接の原因は


@split_filename = (/./,$Mm_file);
の /./ にあります. これが単独で現れたので $_ =~ /./ と解釈されている.
この回答への補足あり
    • good
    • 0

以下のようにしてください。


---------------------------------
@M_raw_data = ("aaa.zip","bbb.zip");
foreach my $M_file (@M_raw_data){


my @split_filename = undef;
my $dir_name = undef;

@split_filename = split(/\./,$M_file);
$dir_name = $split_filename[0];

print $M_file,"\n";
print $split_filename[1],"\n";
print $dir_name,"\n";

}
---------------------------------
@M_raw_data は aaa.zipとbbb.zipを試験用に入れています。
以下、実行結果です。
aaa.zip
zip
aaa
bbb.zip
zip
bbb
    • good
    • 0
この回答へのお礼

迅速なご回答、どうもありがとうございました!おかげさまで作業を進めることができました。助けて頂け、とても感謝しています!

お礼日時:2016/07/01 19:17

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