• ベストアンサー

cgi perlの条件式にて

変数が、数値の場合はA、それ以外はBの処理としたい場合、どのようにすればよいでしょうか。 if ($in{'volume'} == 〇〇〇){A;}else{B;} (1)全角で入力された数字も数値として扱う場合 (2)全角で入力された数字は数値として扱わない場合

質問者が選んだベストアンサー

  • ベストアンサー
  • W_H
  • ベストアンサー率47% (21/44)
回答No.1

数字は、数あるデータの中でも限定されています。10あるうちの9を指定するのと、1を除外するのでは、同じ結果ながら、労力がずいぶん変わってきます。(数学の確立で使う3C2=3C1と同じ。) 今回、純粋な数字データを判別するのは難しいというか、ややこしいので、不純物が入っている場合を判別します。 if($n =~/\D/){B}else{A} と言うのはどうでしょう。 正規表現の中身、/\D/は、『数字以外の一文字にマッチ』というものです。つまり、aとか1aなどには、数字以外の文字列が入っているので、Bに飛ばされ、逆に不純物(文字)がなければ、Aに飛ばされます。 で、次に(1)と(2)について。 if文の前に #$nの全角数字を半角にする $n =~ s/\x82([\x4f-\x58])/ord($1)-0x4f/eg; を書き加えましょう。そうすれば、[$n]の中にある全角数字を半角数字に変換できます。(2)の場合は、これを書かなければいいです。 もし、これも判別したいなら、 if($n=~/\D/){先ほどの処理}else{} とすればいいでしょう。不純物(全角や文字)があれば、一応変換しておこうか、という考え方です。 結構if文は処理の位置を逆にする(式を反対にする)と、楽になる場合があります。

skyresort
質問者

お礼

とても参考になりました。ありがとうございます。

その他の回答 (1)

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.2

アイデアはW_Hさんと同じですが >変数が、数値の場合はA、それ以外はBの処理としたい場合、 unless ($n =~m/\D/) { ##非数値がない => 数値 A }else{ ##非数値がある => 数値ではない B} 次に全角を半角に変えることですが 0x8250とかを使うとSJIS固定になるので trを使うのが見やすいと思います. #trは範囲指定もできるけどあえて「生」で書きます use strict; use warnings; use encoding 'cp932';##ここをソースのコードに合わせる my $a="12345abcあいう"; $a =~ tr/0123456789/0123456789/;##半角になる print $a; もしくは,こういう手もあります. ハッシュを使って, マッチしたときの動作を決めてしまうわけです. この方が汎用的ではあります. my %dispatch = ( "0" => 0, "1" => 1, "2" => 2, "3" => 3, "4" => 4, "5" => 5, "6" => 6, "7" => 7, "8" => 8, "9" => 9, ); $a=~s/([0-9])/$dispatch{"$1"}/eg;

skyresort
質問者

お礼

ハッシュですか。なるほど。ありがとうございます。