如何在哈希数组中使用GetOptions?

时间:2011-04-17 18:43:47

标签: perl

我曾经在哈希数组中使用'GetOptions'。

我在下面有一个哈希数据结构。

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

关键是水果的名称。

然后我想对'水果'名称','数字'和'颜色'使用'GetOptions'。

您能否告诉我如何使用GetOptions ...?

我想使用-n来搜索名称,使用-i作为数字,使用-c作为颜色。

请让我知道...... :(

4 个答案:

答案 0 :(得分:1)

我认为你并不完全理解GetOptions的作用。

它会解析您传入的选项。

所以对你的例子来说:

> myprog.pl --name banana 

在您的计划中,您将拥有:

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

您的$name将包含banana

然后,您需要从该变量中获取名称,从%fruit哈希中提取匹配的条目,然后输出结果。

答案 1 :(得分:0)

%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理解命令行选项是对两个成员数组的引用。

答案 2 :(得分:0)

  

我正在尝试使用getoptions进行名称,数字和颜色搜索。例如,在命令行中输入名称为'banana'的'-n',然后搜索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的值。 (如果GetOptions返回false值,还要检查$ results并给出一条很好的错误消息);

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

答案 3 :(得分:0)

你没有接受答案。所以这可能适合。

因为您没有提供如何调用脚本的示例,我假设是这样的:

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

如果这不是您所需要的,请告诉我们更多信息!

相关问题