問題は、スカラーコンテキストでは、範囲演算子1..5
のフリップフロップバージョンであるということです。
左側のオペランドがtrueになると、範囲演算子は右側のオペランドがtrueになるまでtrueのままになり、その後、範囲演算子は再びfalseになります。
1
は常に真であるため、最初からifステートメントは常に真です。 5
また、は常にtrueであるため、ifステートメントは2回目はfalseになり、その後はfalseのままになります。入力変数がこれに関与することは決してないことに注意してください。
正規表現を使用できますが、使用する場合は、正規表現を固定する必要があります。
if (/^[1-5]$/)
アンカーは、文字列全体が1から5までの1文字であることを保証します。を使用する場合、これは1から5までの数字を含むif (/[1-5]/)
ものと一致するため、有効と見なされます。1200
foo5
ただし、おそらく、ユーザーが入力した内容に基づいて5つの異なることを行うことになります。したがって、おそらく正規表現を使用するべきではなく、各条件を確認するだけです。
if ($_ == 1) { do something }
elsif ($_ == 2) { do something else }
elsif ($_ == 3) { do something else }
elsif ($_ == 4) { do something else }
elsif ($_ == 5) { do something else }
else { handle invalid input }
Switch
異なる構文を使用して、モジュールで同じことを実行できます(コードに含めていますが、実際には使用していません)。
switch ($_) {
case 1 { print "number 1" }
case 2 { print "number 2" }
case 3 { print "number 3" }
case 4 { print "number 4" }
case 5 { print "number 5" }
else { print "invalid" }
}
さらに別の可能性(Raina77owが提案したように)は、smartmatch演算子を使用することです。配列内の要素の存在をチェックするなど、さまざまな用途があります。
my @valid_input = (1..5); #Range operator in list context generates an array.
if ($_ ~~ @valid_input) { print "Input was a number between 1 and 5"; }
匿名配列参照([ ]
)を使用して、そのコードを短縮できます。
if ($_ ~~ [1..5]) { print "Input was a number between 1 and 5"; }