我只想在1到5之间给出输入时进入循环,否则它应该要求“输入有效选项:”
这是我试过的
#!/usr/bin/perl
use strict;
use warnings;
use Switch;
print qq/\tMENU\n 1.BACKUP\n 2.RESTORE\n 3.TABLESPACES\n 4.BUFFERPOOLS\n 5.EXIT\n/;
print "Enter Your Choice : ";
while(<STDIN>){
chomp;
if (1..5){
print qq/wright\n/;
} else {
print qq/wrong\n/;
}
}
我正在中途,并且我试图检查它是否有效,但它不是......即使我给6或7 ......作为输入它给予写,我的意思是它进入if循环而不是其他........帮助被赞赏........
答案 0 :(得分:5)
你的问题是标量上下文中的1..5
是range operator的触发器版本。
一旦左操作数为真,范围运算符将保持为真,直到 右操作数为true,范围运算符变为false 试。
1
始终为true,因此if语句在第一次出现时始终为true。 5
也始终为true,因此if语句在第二次变为false并且之后保持为false。请注意,您的输入变量从不涉及任何此类变量。
你可以使用正则表达式,但如果你这样做,你需要锚定它:
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
module相同的操作(您包含但未在代码中实际使用):
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 operator。它有多种用途,包括检查数组中是否存在元素:
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"; }
答案 1 :(得分:1)
尝试使用此循环:
my $input;
do {
print "Enter valid option: ";
chomp ($input = <STDIN>);
} while ($input < 1 && $input > 5);
答案 2 :(得分:0)
使用if (/^[1-5]$/)
代替if (1..5)
答案 3 :(得分:0)
这个怎么样?
if ($_ =~ /^[1-5]$/)
或
if (/^[1-5]$/)