我在哪里做错了?

时间:2013-03-01 06:54:51

标签: perl

我只想在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循环而不是其他........帮助被赞赏........

4 个答案:

答案 0 :(得分:5)

你的问题是标量上下文中的1..5range operator的触发器版本。

  

一旦左操作数为真,范围运算符将保持为真,直到   右操作数为true,范围运算符变为false   试。

1始终为true,因此if语句在第一次出现时始终为true。 5也始终为true,因此if语句在第二次变为false并且之后保持为false。请注意,您的输入变量从不涉及任何此类变量。

你可以使用正则表达式,但如果你这样做,你需要锚定它:

if (/^[1-5]$/)

锚点确保整个字符串是1到5之间的单个字符。如果您只使用if (/[1-5]/),则匹配包含数字的任何内容1-5,因此1200foo5将被视为有效。

然而,大概你会根据用户输入的内容做五件事。因此,您可能根本不应该使用正则表达式,而只需检查每个条件:

 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]$/)