- ベストアンサー
数値の多い順に別々の処理をする場合
例えば $a = int rand(100); $b = int rand(100); $c = int rand(100); $d = int rand(100); $e = int rand(100); $f = int rand(100); $z = 5; $y = 10; という風にして、$aの数値が一番多い時は「$z + $y」を、$bの数値が一番多い時は「$z - $y」を、と数値を多い順に変数の数だけ別々の処理をしたいときはどうすれば良いのでしょうか? 数日前から気になっていて、初心者なもんでif文やwhile文で地道に長いプログラムしか答えが思いつきません>_< 短くする方法などありましたらどなたか教えてくださいm(_ _)m
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ご質問の意味を正しく理解できているか分かりません・・・数値が一番大きい変数に対応する処理を行うというスクリプトです。 結局、ループと if 文を使っているんですが、三項演算子で短くしてみました。 my @rand_nums = my ($a,$b,$c,$d,$e,$f) = (int rand(100),int rand(100),int rand(100),int rand(100),int rand(100),int rand(100)); my ($z,$y) = (5,10); my $max = -1; $max = $max < $_? $_ : $max foreach (@rand_nums); my $calc = $a == $max? $z+$y: # 注) $b == $max? $z-$y: $c == $max? $z*$y: $d == $max? $z/$y: $e == $max? $z%$y: $z**$y; print "a=$a\nb=$b\nc=$c\nd=$d\ne=$e\nf=$f\n\n"; print "max = $max\n"; print "calc = $calc\n"; # 注) $z+$y: を &sub_a: として、どこかに sub sub_a{return ($z+$y);} を定義してもいいですね。
その他の回答 (2)
- SE-1
- ベストアンサー率57% (26/45)
多重配列とシュワルツ変換使って短くしてみました。 my @rand_nums = ([\&sub_a,int rand(100)],[\&sub_b,int rand(100)],[\&sub_c,int rand(100)],[\&sub_d,int rand(100)],[\&sub_e,int rand(100)],[\&sub_f,int rand(100)]); my ($z,$y) = (5,10); my @sorted_subs = map{$_->[0]}sort{$b->[1] <=> $a->[1]}@rand_nums; &{$sorted_subs[0]}; # 一番大きいのだけ実行。 # &$_ foreach @sorted_subs; # 大きい順に全て実行。 sub sub_a{print "a: ". ($z+$y) ."\n";} sub sub_b{print "b: ". ($z-$y) ."\n";} sub sub_c{print "c: ". ($z*$y) ."\n";} sub sub_d{print "d: ". ($z/$y) ."\n";} sub sub_e{print "e: ". ($z%$y) ."\n";} sub sub_f{print "f: ". ($z**$y) ."\n";}
- guci-ok
- ベストアンサー率33% (49/146)
$a, $b, $c... と、変数を個別に宣言しているのが問題なのだと 思います。 my @data = ($a, $b, $c, $d, $e, $f); my @subs = (\sub_a, \sub_b, \sub_c, \sub_d, \sub_e, \sub_f); for my $data (@data) { my $subref = shift @subs; if (check_data($data)) { $subref($data); } } sub check_data { .... } sub sub_a { .... } sub sub_b { .... } ...
補足
すみません!! my @subs = (\sub_a, \sub_b, \sub_c, \sub_d, \sub_e, \sub_f); の\の意味と if (check_data($data)) { $subref($data); } の働きが分かりません>_< よろしければ教えてもらえないでしょうか?
お礼
自分が考えていたプログラムの1ランク上のご意見でとても分かりやすく勉強になりました^^ ここからまた自分なりに考えてみます。