配列@arrayからファイル名を読み取り、その中身を順次解析し、すべて解析し終わると@arrayの先頭に戻り同じ動作を行うコードなのですが、やたらとネストが増えすぎてしまい困っています。一応、サブルーチンを複数作っても見たのですがどうもスッキリしませんでした。
もう少し良いコードに改良、ご指導して頂けないでしょうか?
$| = 1;
my @array = ("1.txt","2.txt","3.txt");
for(;;){
for my $line (@array){
open(F,"$line");
my @f = <F>;
close F;
for my $line2 (@f){
if($line2 =~ m/test/) {
print $line2;
}else{
print "err\n";
}
}
sleep 1;
}
}
因みに、上記が最終ではなく、最終的には下記のようにしたい(@array部分を外部list.txtにする)のですがネストが増えてしましまい自分でも何を書いているのかよく分からなくなってしまいます。
$| = 1;
for(;;){
my $file = "list.txt";
open(F,"$file");
my @array = <F>;
close F;
chomp @array;
for my $line (@array){
open(F,"$line");
my @f = <F>;
close F;
for my $line2 (@f){
if($line2 =~ m/test/) {
print $line2;
}else{
print "err\n";
}
}
sleep 1;
}
}
__END__
----list.txt-----
1.txt
2.txt
3.txt
a.txt
b.txt
c.txt
-----------------
---1.txt---
test
text
taxt
test1
ttet
-----------
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
私も、自分用に捨てプログラム作るときは、コメントは少ないし、変数も$a,$b,$c...みたいな感じになります。
後から使い回そうとしたとき、perltidyにはよくお世話になります。
perltidyは結構高機能です。
例えば、 -csc オプションを付けると、ループ終わりの } に、その対応する { がわかるようなコメントが追加されます。
今回の場合は「ネストしてループ構造がよくわからない」ということですが、このコメントで大分わかりやすくなります。
他にもいろんなオプションがあるので、試してはどうでしょうか?
例) perltidy -csc -ce -bbb -lbl=1
$| = 1;
for ( ; ; ) {
my $file = "list.txt";
open( F, "$file" );
my @array = <F>;
close F;
chomp @array;
for my $line (@array) {
open( F, "$line" );
my @f = <F>;
close F;
for my $line2 (@f) {
if ( $line2 =~ m/test/ ) {
print $line2;
} else {
print "err\n";
}
} ## end for my $line2 (@f)
sleep 1;
} ## end for my $line (@array)
} ## end for ( ; ; )
No.2
- 回答日時:
現状でもそんなに複雑ではないので、あとは、名前の付け方とか改行とかコメントとかじゃないですかね。
$| = 1;
for(;;){
#listファイルから対象ファイル一覧を取得する
my $listfilename = "list.txt";
open(FP0,'<', $listfilename );
my @filelist = <FP0>;
close FP0;
chomp @filelist;
#全ファイルを処理する
for my $filename(@filelist){
#指定したファイルを読み込む
open(FP,'<',$filename);
my @lines = <FP>;
close FP;
#読み込んだファイルの中を確認する
for my $line (@lines){
if($line =~ m/test/) {
print $line;
}else{
print "err\n";
}
}
sleep 1;
} ## for my $filename(@filelist)
} ## for(;;)
ありがとうございます。自分用に作った場合、コメントアウト無しで作ることが多いです。それでも見直す事もあり、コメントアウトがあると非常に分かりやすくいいですね。
No.1
- 回答日時:
インデントがきちんとしていれば、今のままでも、十分わかりやすいとは思います。
このgooのサイトはインデントが投稿時、崩れるので、元のがきちんとしている前提ですが・・・
とりあえず、サブルーチンを呼び出す形式に変えてみました。
現行のソースより行数は、多少増えています。
-----------------------------------
$| = 1;
for(;;){
sub1("list.txt")
}
sub sub1{
open(F1,$_[0]) or die "open error [$_[0]] $!";
while(<F1>){
chomp $_;
sub2($_);
sleep 1;
}
close F1;
}
sub sub2{
open(F2,$_[0]) or die "open error [$_[0]] $!";
while(<F2>){
if ($_ =~ m/test/){
print $_;
}else{
print "err\n";
}
}
close F2;
}
-----------------------------------------------------
ありがとうございます。
見やすくなりましたね。また、openハンドルをそのまま読ませる方がスッキリして良いですね。
インデントについては普段perltidyで整形しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
system関数と引数について
-
FORTRANのプログラミング
-
[perl] もっとシンプルに改良、...
-
Visual Basicを使って三平方の...
-
Fortranで1行飛ばして読み込む方法
-
ifstream/ofstream について
-
ファイル名を複数個配列で確保...
-
Perlによるディレクトリ内の連...
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
vba dir の相対パス
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
バッチファイルの作り方(CSV→...
-
XML::Parserの parsefileの結果...
-
VBAで巨大なファイルの途中から...
-
VBAでCSVファイルの特定行を書...
-
fgets で値が取得できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「パスが見つかりません」とい...
-
ファイル名を複数個配列で確保...
-
perlで先頭の数値をみて昇順に...
-
Perl エラーログを指定の場所...
-
Pythonでegrep機能をつかいたい
-
Visual Basicを使って三平方の...
-
perlでCSVをソートする方法につ...
-
ifstream を利用した1行分のテ...
-
Pythonで非日本語のUnicode文字...
-
perlプログラム 外部複数ファ...
-
Perlによるディレクトリ内の連...
-
system関数と引数について
-
C++でのテキストファイル読み込...
-
Perlのワンライナーをスクリプ...
-
バッチファイルでテキストファ...
-
Perl 重複カウント 上位3名
-
perlで指定範囲を複数ファイル...
-
perl 計算結果をファイルへ出力...
-
一行だけ読込
-
Fortranで1行飛ばして読み込む方法
おすすめ情報