• ベストアンサー

文字列の条件判定

配列の中身が"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";    } }

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

  • ベストアンサー
回答No.2

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と書かせます。

参考URL:
http://www.site-cooler.com/kwl/perl/8.htm
please-no8
質問者

お礼

^と$で閉じると、文字数も制限できるのですね。 私も先ほどできたのですが、 if( ($array[$i] !~ /0[0-9]/) && ($array[$i] ne "10") || (length(array[$i]) != 2) ){ としていました。 更に短くなってよかったです、ありがとうございます。

その他の回答 (2)

回答No.3

こんにちは。 @err = grep(!/^(0\d|10)$/, @array); ってgrepすれば、一発で@errって配列に エラーのものが入りますよ。

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

比較演算子 < や >は左右の値をそれぞれ数値とみなして比較します 例に出てきた値はそれぞれ "00" --> 0 "20" --> 20 "-4" --> -4 "a0" --> 0 "22c" --> 22 とみなして比較するのでちょっとおかしなことになっているのだと思います("22c"はあれっ変ですね) ところで.. もし "1"という値があったら,それはerrorとみなしていいのでしょうか?

please-no8
質問者

補足

ありがとうございます。 そうですね,errorと見なします。 比較演算子はそうなるのですか、あ、じゃあ,eqやneを使えばいいのですかね。 ちょっとやってみます。

関連するQ&A