1

我只想在输入介于 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循环而不是else............帮助表示赞赏............

4

4 回答 4

5

您的问题是,在标量上下文中是范围运算符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"; }
于 2013-03-01T07:09:44.043 回答
1

试试这个循环:

my $input;
do {
  print "Enter valid option: ";
  chomp ($input = <STDIN>);
} while ($input < 1 && $input > 5);
于 2013-03-01T07:01:33.717 回答
0

那这个呢?

if ($_ =~ /^[1-5]$/)

或者

if (/^[1-5]$/)
于 2013-03-01T07:13:02.510 回答
0

使用if (/^[1-5]$/)而不是if (1..5)

于 2013-03-01T07:01:41.217 回答