0

という配列があります@option

スクリプトが実行されるたびに、@option異なる要素と異なる数の要素の両方が含まれる可能性があります

スクリプトを初めて実行するときは、含まれている可能性があります

犬、猫、カモシカ、象、豚

スクリプトを 2 回目に実行すると、次の内容が含まれる場合があります。

馬、象、ヤギ

必要なもの: 配列の要素を使用して、配列要素の文字列を入力するか、配列内の各要素がリンクされている値を入力するか、考えられる他のより良い方法で、要素を選択するようにユーザーに促します.

例えば:

Please select which one you want to delete by entering its associated number:
dog[1] 
cat[2] 
antelope[3]
elephant[4]
pig[5]

(ユーザーがいずれかを選択した後、コードの残りの部分が処理を実行してから削除します)。

STDIN と一致する場合は dog do this 、象と一致する場合は that などを使用してこれを実行できることはわかっています。

私が実際に探しているのは、人々がこれを行うための最良/最も効率的/最も受け入れられる/専門的/優先/賢い方法と見なすさまざまな方法の提案です。

4

3 に答える 3

1

これが私が思いついたものです。これにより、入力を照会するための文字列を取得でき、応答が有効であることを確認できます。そうでない場合は、ユーザーに再度問い合わせます。サブルーチンは、選択された配列項目のインデックスを返します。

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(@_)返すものです (@_ルーチンに渡された引数を参照し、スカラー関数は配列内の項目の数を返します)。

于 2013-01-24T05:08:24.343 に答える
0

私は次のようなものを提案します

sub get_user_selection {
  my(@choices) = @_;
  my $index = 1;
  for my $choice (@choices) {
    print "$index.) $choices[$index - 1]\n";
    $index++;
  }
  print "Enter your choice: ";
  return $choices[<STDIN> - 1];
}

このサブルーチンはメニューを表示し、ユーザーが数値を入力して選択した値を返します。

于 2013-01-23T21:57:33.630 に答える
0

いくつかの検証を行う必要があります。

for my $id (1 .. scalar @options) {
  my $element = $options[$id - 1];
  say "$id: $element";
}
my $input = <STDIN>;
my $selection = $options[$input - 1];
于 2013-01-23T21:54:16.800 に答える