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のフリップフロップバージョンであるということです。

左側のオペランドがtrueになると、範囲演算子は右側のオペランドがtrueになるまでtrueのままになり、その後、範囲演算子は再びfalseになります。

1は常に真であるため、最初からifステートメントは常に真です。 5また、は常にtrueであるため、ifステートメントは2回目はfalseになり、その後はfalseのままになります。入力変数がこれに関与することは決してないことに注意してください。

正規表現を使用できますが、使用する場合は、正規表現を固定する必要があります。

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

アンカーは、文字列全体が1から5までの1文字であることを保証します。を使用する場合、これは1から5までの数字を含むif (/[1-5]/)ものと一致するため、有効と見なされます。1200foo5

ただし、おそらく、ユーザーが入力した内容に基づいて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"; }
于 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 に答える