これが私が思いついたものです。これにより、入力を照会するための文字列を取得でき、応答が有効であることを確認できます。そうでない場合は、ユーザーに再度問い合わせます。サブルーチンは、選択された配列項目のインデックスを返します。
sub displayMenu($@)
{
# First item is the query string, so shift it
# from the inputs and save it
my $queryString = shift @_;
# Loop control variable;
my $lcv;
# User selection of choices
my $selection;
# Flag to indicate you have the correct input
my $notComplete = 1;
# Clear some space on the screen
print "\n" x 10;
# Loop until you have an answer
while ( $notComplete )
{
print "-" x 40 . "\n";
for( $lcv = 1; $lcv <= scalar(@_) ; $lcv++ )
{
printf " %4d) %s\n",$lcv,$_[$lcv-1];
}
print "\n";
# Query for a response
print "$queryString\n";
# Get response
$selection = <STDIN>;
# Remove the carriage return
chomp($selection);
# Check to make sure it is string of digits
# and it is within the range of the numbers
# If it is, clear the not complete flag
if (( $selection =~ m/^\d*/ ) &&
( 0 < $selection ) && ( scalar(@_) >= $selection))
{
$notComplete = 0;
}
# Else there is a error so try again
else
{
print "\n" x 10;
print "\nIncorrect Input. Try again\n";
}
}
# Return the index of the selected array item
return ($selection - 1);
}
呼び出し方の例は次のとおりです。
$returnValue = displayMenu("Enter number of the item you want to select",("Test1","Test2","Test3"));
呼び出しの最初の項目は、選択の入力用に出力する文字列で、その後に選択対象の項目の配列が続きます。次に、選択からインデックスに戻ります。
以下のコメントからの質問への回答。私の答えは、コメントすることを切望することでした。
部分に分解するprintf " %4d) %s\n",$lcv,$_[$lcv-1]
と、printf は出力をフォーマットするための関数です。print の最初の引数は、行のフォーマットを示す文字列で、その後にフォーマットされる値を提供する項目が続きます。この場合、%4d は整数を出力するためのもので、行の 4 つのスペースを占める必要があり、%s は文字列を出力するためのものです。次の項目は、フォーマット指定子の引数です。この場合は $lcv です。は選択肢の数 (%4d) で$_[$lcv-1]
あり、選択肢です ($lcv-1 はゼロベースのインデックスの配列であり、$_ はルーチンに渡された引数にアクセスするためです。注: 最初の引数をシフトしましたタイトルを取得するために渡された項目の) %s の。http://perldoc.perl.org/functions/sprintf.htmlを見るとさまざまなフォーマット指定子の説明を提供します (sprintf は文字列に出力しますが、フォーマット指定子は printf と同じです)。
これ( 0 < $selection ) && ( scalar(@_) >= $selection))
は、入力が指定された選択肢の範囲内にあることを確認することです。選択はゼロより大きく、項目の数以下である必要があります。ここで、choices がscalar(@_)
返すものです (@_
ルーチンに渡された引数を参照し、スカラー関数は配列内の項目の数を返します)。