• ベストアンサー

入力文字数で条件分岐

$name=""; if(****){ 条件1; } 「$name」に入力されている文字数が 4文字以下のときに「条件1」を実行するには どうすればいいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • taseki
  • ベストアンサー率66% (155/233)
回答No.9

> いえ、文字数を表示するのではなく、 > 全角や日本語が含まれているときに > 処理を実行させたいんです。 以下でできませんでしたか? if ($name !~ /^[\x20-\x7E]*$/) { 処理1; }

すると、全ての回答が全文表示されます。

その他の回答 (10)

回答No.11

>全角や日本語が含まれているときに >処理を実行させたいんです。 最初の4文字以下と言うのはどこにいったのでしょうか? それだとまた処理が全然違ってきますが。 やりたいことは正確に書いてください。

if_else
質問者

お礼

すみません。 説明不足でずいぶん悩ませてしまいました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
回答No.10

>いえ、文字数を表示するのではなく、 >全角や日本語が含まれているときに >処理を実行させたいんです。 文字数はわかりやすいように表示させているだけで正常に文字数が表示されればあとはそれに見合った処理をすればいいだけはないでしょうか? 文字コードがS-JISとのことですが、わたしの示したものは半角であろうとも全角があろうとも混ざっていようとも正確に文字数を返します。 4文字以下なら if ($mojisu <= 4) { } で処理ができます。 もしこれで処理ができないのであれば、具体的にその文字列に何を入れたのか示して下さい。

if_else
質問者

お礼

できました! ありがとうございましたm(_ _)m

すると、全ての回答が全文表示されます。
回答No.8

ちなみに文字コードは本当にS-JISですか?

if_else
質問者

補足

はい、Shift-JISです。

すると、全ての回答が全文表示されます。
回答No.7

>すみません。 >修正してみましたができません! >全角で入力しても処理1が実行されませんでした。 >僕が間違えてるのでしょうか? > >お手数をおかけして申し訳ないm(_ _)m 自分が検証で実行させているものは以下のような感じです。 #!/usr/local/bin/perl $oneByte = '[\x00-\x7F\xA1-\xDF]'; $twoBytes = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])'; $sjis = "(?:$oneByte|$twoBytes)"; $name = 'こんにちわaiueo'; @c = $name =~ /($sjis)/g; $mojisu = scalar(@c); print "文字数:$mojisu\n"; exit; です。 これを実行すれば10文字となりますが。

if_else
質問者

補足

いえ、文字数を表示するのではなく、 全角や日本語が含まれているときに 処理を実行させたいんです。

すると、全ての回答が全文表示されます。
  • taseki
  • ベストアンサー率66% (155/233)
回答No.6

ANo.5ですが、すみません、タイプミスです。 正しくは以下のとおりです。 if ($name !~ /^[\x20-\x7E]*$/) { 処理1; }

すると、全ての回答が全文表示されます。
  • taseki
  • ベストアンサー率66% (155/233)
回答No.5

> 「$name」に半角英数以外の文字が入力されていた場合 > 処理1を行うにはどうすればいいのでしょう? 半角英数(ASCII文字)以外が含まれていたら処理をする、という場合は、以下のように書きます。 if ($name != /^[\x20-\x7E]*$/) { 処理1; } ※改行文字などの考慮を忘れずに これは「ASCII文字だけで構成されていなかったら」という判断ですが、もし文字コードが限定できれば、たとえばShift-JISなら上位の80ビットが立っている、という判断でも可能です。

すると、全ての回答が全文表示されます。
回答No.4

>すみません。もうひとつ質問なのですが、 >「$name」に半角英数以外の文字が入力されていた場合 >処理1を行うにはどうすればいいのでしょう? > >if(????){ >処理1; >} > >よろしくお願いします。 半角があっても全角があっても同じです。 $oneByte = '[\x00-\x7F\xA1-\xDF]'; $twoBytes = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])'; $sjis = "(?:$oneByte|$twoBytes)"; @c = $name =~ /($sjis)/g; $mojisu = scalar(@c); if ($mojisu <= 4) { 処理1; }

if_else
質問者

補足

すみません。 修正してみましたができません! 全角で入力しても処理1が実行されませんでした。 僕が間違えてるのでしょうか? お手数をおかけして申し訳ないm(_ _)m

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

Perl 5.8以降であれば、 encoding プラグマを使用して、使われている文字コードを指定することができます。 例えば、シフトJISで書かれているソースの先頭に use encoding sjis; と書いておけば $str = "日本語の文字数テスト"; print "$str\n"; print length($str) . "文字\n"; は、10文字になります。 プラグマ指定しない時には 20文字になります。 Perl 5.8以降であれば、エンコーディングに気を付けていれば、 基本的に文字数は、バイト数ではなく文字数として扱われます。 なのでそのままlengthで扱えます。

すると、全ての回答が全文表示されます。
回答No.2

文字が半角英数の時は関数lengthを使って length($name); とすれば文字数が取れます。 しかし日本語の時は少々厄介です。 文字コードがS-JISの時は $oneByte = '[\x00-\x7F\xA1-\xDF]'; $twoBytes = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])'; $sjis = "(?:$oneByte|$twoBytes)"; この$sjisが文字コードS-JISの時の一文字を現します。 つまりこの場合の文字数は @c = $name =~ /($sjis)/g; $mojisu = scalar(@c); で取得できます。 同じようにEUCの場合は $ascii = '[\x00-\x7F]'; $twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; $threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; $euc = "(?:$ascii|$twoBytes|$threeBytes)"; @c = $name =~ /($euc)/g; $mojisu = scalar(@c); あるいはJcode.pmやjcode.plで文字コードを統一しておいた方がいいです。

if_else
質問者

補足

すみません。もうひとつ質問なのですが、 「$name」に半角英数以外の文字が入力されていた場合 処理1を行うにはどうすればいいのでしょう? if(????){ 処理1; } よろしくお願いします。

すると、全ての回答が全文表示されます。
  • 2NN
  • ベストアンサー率40% (143/353)
回答No.1

if(length $name <= 4){ 条件1; } で実行できます。

if_else
質問者

お礼

ありがとうございます。 おかげさまでできました。

すると、全ての回答が全文表示されます。

関連するQ&A