- ベストアンサー
do-while文での無限ループ?
こんにちは。 いつもお世話になっております。 現在Perlを使用してプログラムを組んでいますが、無限ループになってしまうらしく、次の画面に遷移しません。 @selected2には最大10個までの要素が入ります。(要素数は都度違う) その要素の中から$carno以外の要素を1つ選びたいのですが、このプログラムだとうまく動きません。 do-whileを取るととりあえずは動くので、条件の所が間違っているようなのですが、どう考えても正しいような気がします。 do{ if($ransuu==0){ $ransuu=int rand(11); } for($k=1;$k<=$a;$k++){ if($selected2[$k]==$ransuu){ $second=$ransuu; } } }while($ransuu==$carno || $second!=$ransuu); アドバイスをよろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
$a って何だろうとかいろいろあるんだが・・・ @temp = grep {$_ != $carno} @selected2 ; $second = $temp[int rand(scalar @temp) + 1]; ってことでしょうか? @selected2の要素のうち,$carnoと一致しないものからなる 配列をつくり,その配列の任意の要素を取り出せばいいんですよね 質問のコードだと 1から10までの乱数$ransuuをとって, @seleted2の要素で$rasuuと一致するものを探す となってますが? 配列の要素とインデックスが混じってませんか? 余計なおせわかもしれないけど for($k=1;$k<=$a;$k++) は for $k (1..$a) の方がPerl的で見やすいでしょう 後置のdo-whileも避けた方がたぶんメンテナンスしやすいです. あとPerlでは$aと$bは特別な用途で使われることがあるから 避けた方がいろいろ無難です.
その他の回答 (3)
- kabaokaba
- ベストアンサー率51% (724/1416)
>$second = $temp[int rand(scalar @temp) + 1]; うわ,まちがった(^^;; $second = $temp[int rand(scalar @temp)]; ですね.
- Tacosan
- ベストアンサー率23% (3656/15482)
その書き換えは, おそらく全然本質じゃないと思う. ところで, 最初の if 文はどういう意味なの?
- Tacosan
- ベストアンサー率23% (3656/15482)
厳密な条件じゃないけど, $ransuu が 0 でなくかつ @selected2 の中に入っていないと無限ループになる可能性があります.
補足
Tacosanさん 早速のご回答ありがとうございます。 以下のように書き換えましたら無限ループはなくなりました。 while($ransuu==0 && ($ransuu==$carno || $second!=$ransuu)) ですが、思うように動きません。 $ransuu==$carno でも $second!=$ransuu でもdo-while文から抜けてしまい、@selected2の要素以外や$carnoの値も$secondに入ってしまいます。 何かおかしいでしょうか?
お礼
kabaokabaさん どうもありがとうございます。 無事動きました。