質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

1回答

1481閲覧

Perlでの無限ループについて

退会済みユーザー

退会済みユーザー

総合スコア0

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2014/11/15 12:07

Perlで以下の文字列突合用のソースを書いたのですが、質問させてください。
一回目の<ファイルごとにループ>は無事に完了するのですが、二回目のループでは突合処理内の二回目のネストループで無限ループに入ってしまいます。
一回目と挙動は同じになるはずなのにこのような事象が出てしまうのは何故なのでしょうか。。
皆さまのお力をお貸し頂ければ幸いです。

lang

1#! /usr/bin/perl 2 3### 格納リスト ### 4@FILECHECK = (); 5@NEWFILELIST = (); 6@LASTFILELIST = (); 7@TWONEWLIST = (); 8@TWONLASTLIST = (); 9@NEWCELLLIST = (); 10@LASTCELLLIST = (); 11@OUTPUT = (); 12@OUTFIRSTPUT = (); 13 14### 変数宣言 ### 15$filecheck; 16$newflag; 17$lastflag; 18$cnt; 19$innewtmp; 20$inlasttmp; 21$newcnt; 22$lastcnt; 23$ReNewFileName; 24$ReLastFileName; 25$readnewline; 26$readlastline; 27 28 29 30# ファイル有無のチェック 31@FILECHECK = glob("*"); 32# 配列要素の取得 33$filecheck = @FILECHECK; 34 35 36# 判定フラグ 37$newflag = 0; 38$lastflag = 0; 39 40# エンコード 41use Encode; 42use utf8; 43 44 45# ファイル分ループ 46for(@FILECHECK){ 47 if($FILECHECK[$cnt] eq "newapfile"){ 48 $newflag = 1; 49 }elsif($FILECHECK[$cnt] eq "lastapfile"){ 50 $lastflag = 1; 51 }elsif($cnt==$filecheck-1 && $newflag==0){ 52 print "not there NewAPFile !!\n"; 53 exit; 54 }elsif($cnt==$filecheck-1 && $lastflag==0){ 55 print "not there LastAPFile\n"; 56 exit; 57 }elsif($cnt==$filecheck-1 && $newflag==1 && $lastflag==1){ 58 last; 59 }$cnt++; 60} 61print "Let's APmatching start !!\n"; 62 63 64### csvファイル一覧取得 ###\ 65@NEWFILELIST = glob("newapfile/*.csv"); 66@LASTFILELIST = glob("lastapfile/*.csv"); 67 68 69 70### ファイルごとにループ ### 71for($newcnt=0; $newcnt<scalar(@NEWFILELIST); $newcnt++){ 72 73 $ReNewFileName = 0; 74 $ReNewFileName = $NEWFILELIST[$newcnt]; 75 $ReNewFileName =~ s/newapfile//g; 76 77 for($lastcnt=0; $lastcnt<scalar(@LASTFILELIST); $lastcnt++){ 78 79 $ReLastFileName = 0; 80 $ReLastFileName = $LASTFILELIST[$lastcnt]; 81 $ReLastFileName =~ s/lastapfile//g; 82 83 if($ReNewFileName eq $ReLastFileName){ 84 85 print "matching $ReNewFileName\n"; 86 print "matching $ReLastFileName\n"; 87 print "Done..\n"; 88 89 @OUTPUT = (); 90 @OUTFIRSTPUT = (); 91 push(@OUTFIRSTPUT, $ReNewFileName); 92 push(@OUTPUT, [@OUTFIRSTPUT]); 93 94 95 # 二次元配列用 96 @TWONEWLIST = (); 97 @TWONLASTLIST = (); 98 99 open INNEW, "<:encoding(shift-jis)", "$NEWFILELIST[$newcnt]" or die("could not open file."); 100 open INLAST, "<:encoding(shift-jis)","$LASTFILELIST[$lastcnt]" or die("could not open file."); 101 102 103 104 ### ファイルを1行ずつ読み込んで二次元配列に格納 ### 105 106 $readnewline = 0; 107 while(my $readnewline = <INNEW>){ 108 chomp $readnewline; 109 @NEWCELLLIST = (); 110 @NEWCELLLIST = split /\,/, encode("utf-8", $readnewline); 111 push(@TWONEWLIST, [@NEWCELLLIST]); 112 $i++; 113 } 114 close INNEW; 115 116 $readlastline = 0; 117 while(my $readlastline = <INLAST>){ 118 chomp $readlastline; 119 @LASTCELLLIST = (); 120 @LASTCELLLIST = split /\,/, encode("utf-8", $readlastline); 121 push(@TWOLASTLIST, [@LASTCELLLIST]); 122 } 123 close INLAST; 124 125 $i=0; 126 $j=0; 127 128 129 ### 突合処理 ### 130 while($i<scalar(@TWOLASTLIST)){ 131 132 while($j<scalar(@TWONEWLIST)){ 133 $k = 0; 134 $l = 0; 135 @OUTFIRSTPUT = (); 136 137 while($k<scalar(@{$TWOLASTLIST[$i]})){ 138 139 while($l<scalar(@{$TWONEWLIST[$j]})){ 140 141 # エラー2のケース(数値) 142 if($TWOLASTLIST[$i][$k] =~ /^[0-9]+$/){ 143 if($TWOLASTLIST[$i][$k] == $TWONEWLIST[$j][$l]){ 144 push(@OUTFIRSTPUT, "0,"); 145 $k++; 146 $l++; 147 last; 148 }else{ 149 push(@OUTFIRSTPUT, "1,"); 150 $k++; 151 $l++; 152 last; 153 } 154 } 155 # エラー2のケース(マイナスの場合) 156 elsif($TWOLASTLIST[$i][$k] =~ /-/){ 157 if($TWOLASTLIST[$i][$k] == $TWONEWLIST[$j][$l]){ 158 push(@OUTFIRSTPUT, "0,"); 159 $k++; 160 $l++; 161 last; 162 }else{ 163 push(@OUTFIRSTPUT, "1,"); 164 $k++; 165 $l++; 166 last; 167 } 168 } 169 # エラー2のケース(空白の場合) 170 elsif($TWOLASTLIST[$i][$k] =~ /\s/){ 171 if($TWOLASTLIST[$i][$k] == $TWONEWLIST[$j][$l]){ 172 push(@OUTFIRSTPUT, "ok null,"); 173 $k++; 174 $l++; 175 last; 176 }else{ 177 push(@OUTFIRSTPUT, "bad null,"); 178 $k++; 179 $l++; 180 last; 181 } 182 } 183 # エラー1のケース(文字列) 184 else{ 185 if($TWOLASTLIST[$i][$k] eq $TWONEWLIST[$j][$l]){ 186 push(@OUTFIRSTPUT, "True,"); 187 $k++; 188 $l++; 189 last; 190 }else{ 191 push(@OUTFIRSTPUT, "FALSE,"); 192 push(@OUTPUT, [@OUTFIRSTPUT]); 193 @OUTFIRSTPUT = (); 194 $j++; 195 $k = 0; 196 $l = 0; 197 last; 198 } 199 } 200 } 201 } 202 push(@OUTPUT, [@OUTFIRSTPUT]); 203 $j++; 204 $i++; 205 206 } 207 $i++; 208 } 209 open OUT, ">APmatching_$newcnt.csv"; 210 for($m=0; $m<scalar(@OUTPUT); $m++){ 211 print OUT encode("UTF-8", "@{$OUTPUT[$m]}\n"); 212 } 213 close OUT; 214 } 215 } 216}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

おそらくですが、最後の方のif-elseの、カウンター$kをゼロにしているところに入ってしまうと、$kのループを永久に抜けられないように見えます。

どんなデータが来るのか分からないので、再現させることはできませんでした。
もし違っていたら、発生条件や実行環境の情報も書いていただければと思います。

投稿2014/11/15 14:18

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaMaMhyu

2014/11/17 01:48

その$kと$lのリセットをしているブロックは、lastで抜けるつもりのループがずれているかもしれませんね。$lのループしか抜けないはずなので…
argius

2014/11/17 03:43

おそらくそうですね。 見落としの問題と思ったので、理由は省いてしまいました。 補足ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問