您的问题是,在标量上下文中是范围运算符1..5
的触发器版本。
一旦左操作数为真,范围运算符保持真,直到右操作数为真,之后范围运算符再次变为假。
1
总是正确的,所以你的 if 语句在第一次通过时总是正确的。 5
也始终为真,因此 if 语句第二次变为假,此后保持假。请注意,您的输入变量永远不会参与其中。
您可以使用正则表达式,但如果您需要锚定它:
if (/^[1-5]$/)
锚点确保整个字符串是 1 到 5 之间的单个字符。如果您只使用if (/[1-5]/)
,则匹配包含数字 1-5 的任何内容,因此1200
并且foo5
将被视为有效。
但是,假设您将根据用户输入的内容执行五项不同的操作。因此,您可能根本不应该使用正则表达式,而只需检查每个条件:
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"; }