#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);
}