- ベストアンサー
文字列の条件判定
配列の中身が"00"~"10"でなかったらerrorを出力するプログラムを作りたいです。 以下のようなプログラムを書くと、"20"や"-4"などには対応できるのですが、 英語が入るとエラーが出ません("a0"とか)。また、("22c")などもエラーが出ません。 なぜなんでしょう?そしてどうやって書けばいいのでしょうか・・・。 for( $i = 0 ; $i <= $#array ; $i++ ){ if( ($array[$i] < "00" ) || ( $array[$i] > "10" ) ){ print "$array[$i]\n"; print "error\n"; } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
00,01....09,10ならよし、それ以外ならエラーなのですよね。 22cが例に挙がっているということは桁数は決まっていないわけですね。 正規表現のマッチングを使って if( ($array[$i] !~ /^0\d$/ ) and ( $array[$i] ne "10" ) ) というのはどうでしょう。 ^0\d$ は、「最初に0、次に一桁の数字で終わり」という文字列を指します。 ^0[0-9]$ でも同じです。 $array[$i] !~ /^0\d$/ で、00~09でないこと $array[$i] ne "10" で、10でないこと を判定し、どちらの条件も満たす場合にerrorと書かせます。
その他の回答 (2)
- GuruGuru22
- ベストアンサー率51% (177/346)
こんにちは。 @err = grep(!/^(0\d|10)$/, @array); ってgrepすれば、一発で@errって配列に エラーのものが入りますよ。
- moon_piyo
- ベストアンサー率60% (88/146)
比較演算子 < や >は左右の値をそれぞれ数値とみなして比較します 例に出てきた値はそれぞれ "00" --> 0 "20" --> 20 "-4" --> -4 "a0" --> 0 "22c" --> 22 とみなして比較するのでちょっとおかしなことになっているのだと思います("22c"はあれっ変ですね) ところで.. もし "1"という値があったら,それはerrorとみなしていいのでしょうか?
補足
ありがとうございます。 そうですね,errorと見なします。 比較演算子はそうなるのですか、あ、じゃあ,eqやneを使えばいいのですかね。 ちょっとやってみます。
お礼
^と$で閉じると、文字数も制限できるのですね。 私も先ほどできたのですが、 if( ($array[$i] !~ /0[0-9]/) && ($array[$i] ne "10") || (length(array[$i]) != 2) ){ としていました。 更に短くなってよかったです、ありがとうございます。