Как использовать GetOptions в хэш-массиве?

#perl

#perl

Вопрос:

Я использовал ‘GetOptions’ в хэш-массивах.

У меня есть хэш-структура данных ниже.

 %fruit=(
    banana => [ 1, "yellow" ],
    cherry => [ 2, "dark red" ],
    strawberry => [ 3, "red" ],
);
  

Ключ — это название фруктов.

Затем я хочу использовать ‘GetOptions’ для ‘имени’, ‘номера’ и ‘цвета’ фрукта.

Не могли бы вы, пожалуйста, сообщить мне, как использовать GetOptions …?

Я хочу использовать like -n для поиска имени и -i для числа и -c для цвета.

Пожалуйста, дайте мне знать … 🙁

Комментарии:

1. GetOptions предназначен для обработки параметров командной строки. Что именно ты пытаешься сделать?

2. Я пытаюсь использовать getoptions для поиска по имени, номеру и цвету. Например, введите ‘-n’ с именем типа ‘banana’ в командной строке, затем выполните поиск banana=>[1, «желтый»]…

3. @user712390: Это не то, что вы задаете в своем вопросе. Если вы хотите иметь возможность анализировать «-n 1» или «-c red» в качестве входных данных командной строки, вы используете GetOptions очень простым способом. Смотрите GetOptions . Переформулируйте свой вопрос, указав именно то, чего вы хотите достичь.

4. примеры командных строк и выходных данных сделали бы вопрос намного понятнее

5. Извините за мою мини-тираду, но почему люди, зарабатывающие на жизнь программированием, не знают, как указать пример входных и желаемых выходных состояний? 1) Как будет выглядеть командная строка, 2) что вы хотите сделать с вводом?

Ответ №1:

Я не думаю, что вы вполне понимаете, что GetOptions делает.

Он анализирует параметры, которые вы передали.

Итак, для вашего примера:

 > myprog.pl --name banana 
  

В вашей программе у вас было бы:

 my $name;
GetOptions("name=s" => $name);
  

Тогда ваш $name будет содержать banana

Затем вам нужно будет получить имя из этой переменной, извлечь соответствующую запись из вашего %fruit хэша и вывести результаты.

Ответ №2:

%fruit это хэш, но значения в хэше являются ССЫЛКАМИ на массив из двух элементов.

Что делает GetOptions, так это берет массив (например, %ARGV) и анализирует параметры из этого массива. Вы можете поместить эти параметры в скаляры, массивы и даже хэши, но нет прямого способа сказать, что параметр командной строки является ссылкой на массив.

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

 $ myprogram --fruit banana=yellow --fruit cherry="dark red" --fruit strawberry=red
  

Тогда вы можете иметь:

  GetOptions('fruit=s' => @fruitHash);
  

Массив будет выглядеть следующим образом:

 $fruit[0] = 'banana=yellow';
$fruit[1] = 'cherry=dark red';
$fruit[2] = 'strawberry=red';
  

Оттуда вы могли бы просмотреть массив и создать свою ссылку на хэш:

 my %fruitHash;
my $count = 1;
foreach my $value (@fruit) {
    my ($fruit, $color) = split(/=/, $value);
    $fruit{$fruit}=>[0] = $count,
    $fruit{$fruit)=>[1] = $color,
}
  

Невозможно заставить GetOptions понять, что параметры командной строки являются ссылкой на массив из двух элементов.

Ответ №3:

Вы не приняли ответ. Так что, возможно, этот вариант подходит.

Поскольку вы не предоставили примеров того, как вызвать ваш скрипт, я предполагаю что-то вроде этого:

 test.pl -i 3
  

дает нам

 strawberry, 3, red
  

и

 test.pl -n cherry
  

дает нам

 cherry, 2, dark red
  

и

 test.pl - c yellow
  

дает нам

 banana, 1, yellow
  

Используйте следующий скрипт:

 #!/usr/local/bin/perl -w

use strict;
use warnings;

use Getopt::Std;
use vars qw (%opt);

getopts( "i:n:c:", %opt ) or usage();

use Data::Dumper;
my %fruit=(
    banana => [ 1, "yellow" ],
    cherry => [ 2, "dark red" ],
    strawberry => [ 3, "red" ],
);

if ($opt{n}) {
   print "Fruit: $opt{n}, $fruit{$opt{n}}[0], $fruit{$opt{n}}[1] n";
} elsif ($opt{i}) {
   while( my ($key, $value) = each %fruit) {
      if ($opt{i} == $value->[0] ) {
         print "Fruit: $key, $value->[0], $value->[1] n";
         last;
      }
   }
} elsif ($opt{c}) {
   while( my ($key, $value) = each %fruit) {
      if ($opt{c} eq $value->[1] ) {
         print "Fruit: $key, $value->[0], $value->[1] n";
         last;
      }
   }
}
  

Если это не то, что вам нужно, расскажите нам подробнее!

Ответ №4:

Я пытаюсь использовать getoptions для поиска по имени, номеру и цвету. Например, введите '-n' с именем типа 'banana' в командной строке, затем выполните поиск banana=>[1, "желтый"]

Это не ваш вопрос. Это довольно просто:

 use GetOpt::Long;


my ($number, $name, $color);
my $results = GetOptions (
    "number=i" => $number,
    "name=s"   => $name,
    "color=s"  => $color,
);
  

Затем проверьте значения $number, $name и $ color. (Также проверьте $results и выдайте хорошее сообщение об ошибке, если GetOptions возвращает false значение);

 my $numOfParams = 0;
if ($color)  {$numOfParams  };
if ($number) {$numOfParams  };
if ($name)   {$numOfParams  };

die qq(Too many options givenn) if ($numOfParams > 1);
die qq(You didn't give any parametersn) #'
    if ($NumOfParams == 0);

if ($color) {
    searchOnColor($color);
} elsif ($number) {
    searchOnNumber($number);
} elsif ($name) {
    searchOnName($name);
}