- ベストアンサー
Perlでの改造方法
とほほHPでPerlについて勉強し始めたのですが、わからない箇所があり困っております。 フォームaに「1」と記入した場合はフォームbに「2」と記入しないとエラーが起こるようにしたいのですが、どうしてもわかりません。 if ($in{'a'} =~ /1/だった場合に$in{'a'} !~/2/) {&error("エラー文字");} こんな感じにしたいのですが、どうすればいいのでしょうか。 また、Perlの勉強をするにお勧めの本などありましたら教えていただけると助かります。宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> if ($in{'a'} == a1 and $in{'b'} == b1) { > # OK > } else { > # エラー > } ==演算子を使った場合、数値として比較され、 数字を含まない文字列はすべて数値の0として扱われます。 文字列として比較する場合は ==演算子ではなく eq演算子を使ってください。 > if ($in{'a'} eq "word1" and $in{'b'} eq "word2") { あと、a1やb1は"a1"や"b1"という文字列のつもりでしょうか? 文字列なら、それと分かるようにダブルコーテーションなどで囲んだ方が良いです。 もしまだうまくいかない場合は、どのような不都合なのかの具体的な補足をお願いします。 ($in{'a'}に文字列"xxx"が入っているとき、if($in{'a'} eq "xxx"){#OK}でOKにならない、などのように) なお、あえて正規表現をつかって完全一致を調べるなら > $a =~ /^word1$/ とする方法があります。 (これくらいなら正規表現を使わなくてもeqで良いですが。)
その他の回答 (2)
- moon_night
- ベストアンサー率32% (598/1831)
$in{'a'} =~ /1/ だと、 123 や 52147 や あああ1あああ 等でも通ってしまうので、 if ($in{'a'} == 1 and $in{'b'} == 2) { # OK } else { # エラー } とすればいいのではないでしょうか。
お礼
ご回答有難うございます。大変勉強になりました。
補足
あれから教えていただいた方法でいろいろ試してみましたが、上手くいきませんでした。 > $in{'a'} =~ /1/ > だと、 123 や 52147 や あああ1あああ 等でも通ってしまうので、 指定された文字列が含まれるでなく、指定された文字列以外はエラーが起こるようにするにはどうすればいいのでしょうか。お手数をおかけしますが、宜しくお願いいたします。
- Werner
- ベストアンサー率53% (395/735)
ifの中に「条件Aかつ条件B」という条件を書きたい場合は、 && または and を使ってください。 > if ($in{'a'} =~ /1/ && $in{'a'} !~/2/) &&などの詳しいことは、 http://www.rfs.jp/sb/perl/02/03.html の「論理演算子」を見てください。 またそれ以外の書き方として、ifを2つ使うことも考えられます。 > if ($in{'a'} =~ /1/){ > if($in{'a'} !~/2/){処理} > }
お礼
ご回答有難うございました。おかげさまで解決できました。
補足
何度も申し訳ございません。No.2でのmoon nightさんへの「この回答への補足」では説明不足でした。 教えていただいた方法で条件が一つだけでしたら問題なく動作致しました。ですが私の場合は以下のように使用しており、このように複数指定した場合はうまく動作しませんでした。また数字ではなく、文字列の場合も不具合が起こるようです。勉強不足で大変恐縮ですが、宜しくお願いいたします。 if ($in{'a'} == a1 and $in{'b'} == b1) { # OK } else { # エラー } if ($in{'a'} == a2 and $in{'b'} == b2) { # OK } else { # エラー } if ($in{'a'} == a3 and $in{'b'} == b3) { # OK } else { # エラー }
お礼
ご回答有難うございました。 お返事いただく前に思考錯誤して以下の内容で修正しておりましたが、その事をお伝えするためのスペースがありませんでした。このような感じでよろしいのでしょうか。 if ($in{'a'} =~ /^(a1)$/ and $in{'b'} !~/^(b1)$/) { エラー } if ($in{'a'} =~ /^(a2)$/ and $in{'b'} !~/^(b2)$/) { エラー } 教えていただいた方法でもいろいろ試してみます。大変勉強になるご回答を本当に有難うございました。