Nano Hash - криптовалюты, майнинг, программирование

Perl использует различные элементы в массиве для пользовательского меню опций

У меня есть массив с именем @option

При каждом запуске скрипта @option может содержать как разные элементы, так и разное количество элементов.

При первом запуске скрипт может содержать

собака, кошка, антилопа, слон, свинья

При втором запуске сценария он может содержать

лошадь, слон, коза

Что мне нужно: используя элементы из массива, предложите пользователю выбрать элемент, либо введя строку элемента массива, либо введя значение, с которым связан каждый элемент в массиве, либо любым другим способом. лучший метод, который вы можете придумать.

Например:

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

(после того, как пользователь выберет один, остальная часть моего кода сделает что-то, а затем удалит его).

Я знаю, что мог бы сделать это, используя если STDIN соответствует собаке, сделайте это, если он соответствует слону, сделайте то и так далее.

На самом деле я ищу предложения по различным методам, которые люди считают наилучшим/наиболее эффективным/наиболее приемлемым/профессиональным/предпочтительным/умным способом сделать это.


  • Будьте осторожны с подобными вопросами — они могут быть закрыты и классифицированы как «неконструктивные»: В настоящее время этот вопрос не подходит для нашего формата вопросов и ответов. Мы ожидаем, что ответы будут подкреплены фактами, ссылками или конкретным опытом, но этот вопрос, скорее всего, вызовет дебаты, аргументы, опросы или расширенное обсуждение. 24.01.2013
  • Вы смотрели CPAN для систем с меню? 24.01.2013
  • @Jonathan Leffler - Да, я просмотрел CPAN, где есть несколько решений, но в идеале я искал лучший метод без использования модуля, также спасибо за ваш совет. 24.01.2013

Ответы:


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 будет функцией для форматирования вывода. Первый аргумент для печати, если это строка, указывающая формат строки, за которой следуют элементы, которые предоставляют значения для форматирования. В этом случае %4d предназначен для вывода целого числа, которое должно занимать 4 пробела в строке, а %s — для вывода строки. Следующие элементы являются аргументами для спецификаторов формата, в данном случае $lcv - это число выбора (% 4d), а $_[$lcv-1] - это выбор ($ lcv-1 - это потому, что массив в индексе с отсчетом от нуля, а $_ - это доступ к аргументам, где передано в подпрограмму. ПРИМЕЧАНИЕ. Я переместил первый аргумент элементов, переданных для получения заголовка) для %s. Если вы посмотрите на http://perldoc.perl.org/functions/sprintf.html он дает описание различных спецификаторов формата (sprintf предназначен для печати в строку, но спецификаторы формата одинаковы для printf).

( 0 < $selection ) && ( scalar(@_) >= $selection)) должен убедиться, что ввод находится в заданном диапазоне вариантов. Выбор должен быть больше нуля и меньше или равен количеству элементов, которые выбираются, что и возвращает scalar(@_) (@_ относится к аргументам, переданным в подпрограмму, а скалярная функция возвращает количество элементов в массиве ).

24.01.2013
  • Большое спасибо за ваш ответ, это именно то, что мне нужно. Не могли бы вы объяснить мне более подробно, что делают следующие строки, это 'printf %4d) %s\n,$lcv,$_[$lcv-1];' и '( 0 ‹ $selection ) && ( scalar(@_) ›= $selection))', так как я немного не уверен, спасибо за вашу помощь 01.02.2013
  • Мой ответ не поместился в комментарии, поэтому я добавил его к ответу выше. Рада быть полезной и полезной для вас. 01.02.2013
  • Большое спасибо, вы мне очень помогли, вы все прекрасно объяснили, спасибо еще раз. 01.02.2013

  • 2

    Вам нужно будет сделать некоторую проверку.

    for my $id (1 .. scalar @options) {
      my $element = $options[$id - 1];
      say "$id: $element";
    }
    my $input = <STDIN>;
    my $selection = $options[$input - 1];
    
    23.01.2013
  • Спасибо, это было то, что я искал. Считаете ли вы это предпочтительным методом сделать что-то подобное или просто одним из многих вариантов? 24.01.2013
  • Когда вы упомянули «Вам нужно сделать некоторую проверку», что вы имели в виду? Спасибо. 24.01.2013
  • Это настолько просто, насколько вы можете получить - перебрать количество элементов в массиве, распечатать идентификатор и количество элементов, а затем получить выбор по индексу. (сдвинут на единицу, так как индексы отсчитываются от 0, а идентификаторы обычно отсчитываются от 1) 24.01.2013
  • Например, они не вводят «asdf» и обрабатывают повторную подсказку, если это так. 24.01.2013
  • Спасибо, только что ответил на мой вопрос, теперь я понимаю, что вы имеете в виду. 24.01.2013
  • Когда вы говорите, что это «настолько просто, насколько вы можете получить», вы имеете в виду, что это хорошо, и что это будет лучший метод для использования в этом случае? Или будет предпочтительный, более сложный способ сделать это? 24.01.2013

  • 3

    Я бы предложил что-то вроде

    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];
    }
    

    Эта подпрограмма отобразит меню и вернет значение, выбранное пользователем путем ввода числа.

    23.01.2013
  • Спасибо, это тоже было то, что я искал, попробую их обоих. 24.01.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..