アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。
いつもお世話になっております。

現在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);

アドバイスをよろしくお願いいたします。

A 回答 (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は特別な用途で使われることがあるから
避けた方がいろいろ無難です.
    • good
    • 0
この回答へのお礼

kabaokabaさん

どうもありがとうございます。
無事動きました。

お礼日時:2008/05/02 11:03

>$second = $temp[int rand(scalar @temp) + 1];



うわ,まちがった(^^;;
$second = $temp[int rand(scalar @temp)];
ですね.
    • good
    • 0

その書き換えは, おそらく全然本質じゃないと思う.


ところで, 最初の if 文はどういう意味なの?
    • good
    • 0

厳密な条件じゃないけど, $ransuu が 0 でなくかつ @selected2 の中に入っていないと無限ループになる可能性があ

ります.

この回答への補足

Tacosanさん
早速のご回答ありがとうございます。
以下のように書き換えましたら無限ループはなくなりました。
while($ransuu==0 && ($ransuu==$carno || $second!=$ransuu))

ですが、思うように動きません。
$ransuu==$carno でも $second!=$ransuu でもdo-while文から抜けてしまい、@selected2の要素以外や$carnoの値も$secondに入ってしまいます。

何かおかしいでしょうか?

補足日時:2008/05/01 18:32
    • good
    • 0

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