Как использовать GetOptions в массиве хэшей? - PullRequest
0 голосов
/ 17 апреля 2011

Я использовал 'GetOptions' в хеш-массивах.

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

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

Ключ - имя фруктов.

ТогдаЯ хочу использовать «GetOptions» для фруктов «name», «number» и «color».

Не могли бы вы дать мне знать, как использовать GetOptions ...?

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

Пожалуйста, дайте мне знать ...: (

Ответы [ 4 ]

1 голос
/ 17 апреля 2011

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

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

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

> myprog.pl --name banana 

В вашей программе вы должны иметь:

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

Ваш $name будет содержать banana

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

0 голосов
/ 12 февраля 2013

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

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

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

Если это не то, что вам нужно, сообщите нам больше!

0 голосов
/ 17 апреля 2011

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

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

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 given\n) if ($numOfParams > 1);
die qq(You didn't give any parameters\n) #'
    if ($NumOfParams == 0);

if ($color) {
    searchOnColor($color);
} elsif ($number) {
    searchOnNumber($number);
} elsif ($name) {
    searchOnName($name);
}
0 голосов
/ 17 апреля 2011

%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 понимать, что параметры командной строки являются ссылкой на массив из двух элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...