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.3ベストアンサー
- 回答日時:
いや, エスケープしているかどうかの問題ではなく (もちろんエスケープしないと期待した動作にはならんけど)
/./ という正規表現を単独で書いたために $_ とのマッチングと解釈される
ことが問題なのです. 実際,
@split_filename = (/./,$Mm_file);
でエスケープして
@split_filename = (/\./,$Mm_file);
としたところで同じことになるはずですよ.
そういえば今ふと思ったんだけど, これって split する必要あるのかなぁ? あとでどうするのか知らんけど, 単純にファイル名がほしいだけなら s/// で対処する方が正統な感じがする.
ああ!大変しょうもないミスをしていました、お時間を割いていただき誠に申しわけありません…。
また、s///を使う発想がなかったもので、とても勉強になりました。本当に、どうもありがとうございました!
No.2
- 回答日時:
「どう直せばいいか」は #1 の通りだけど, そうなる直接の原因は
@split_filename = (/./,$Mm_file);
の /./ にあります. これが単独で現れたので $_ =~ /./ と解釈されている.
No.1
- 回答日時:
以下のようにしてください。
---------------------------------
@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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
window.open でのファイル指定方法
-
fgets で値が取得できない
-
MATLABのm-fileについて
-
WindowsでPerlをする際,1行目の...
-
ファイル全てを .xlsm に変更し...
-
ファイルの存在の有無を確かめ...
-
巨大なテキストの最終行を取得...
-
fortranのopen文について。
-
行を指定して削除する方法PERL
-
JSP URLに表示される拡張子 .jsp
-
PerlでHTTPを扱いたい
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python renameについて
-
fgets で値が取得できない
-
window.open でのファイル指定方法
-
巨大なテキストの最終行を取得...
-
ファイル全てを .xlsm に変更し...
-
read() on unopened filehandle...
-
csvファイルの横方向への改行に...
-
VBAコードを張り付け後のエクセ...
-
Firefox で file:// で始まる U...
-
JSP URLに表示される拡張子 .jsp
-
drtファイルはどうしたら開...
-
並び方、
-
重複ファイル名ある場合ファイ...
-
VBA テキストファイルを読み取...
-
cgiでサーバーにファイルを追加...
-
HTMLのフォームで画像と文...
-
WindowsでPerlをする際,1行目の...
-
バイナリファイルの出力
-
Perlでのパーミッション変更の仕方
-
foreach内での変数の扱い?
おすすめ情報
ご解説をありがとうございます!この場では . に対しエスケープが必要、ということで良いのでしょうか?お手数おかけしますが、お答えいただけると嬉しいです。