Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在哈希数组中使用GetOptions?_Perl - Fatal编程技术网

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

Perl 如何在哈希数组中使用GetOptions?,perl,Perl,我曾经在散列数组中使用“GetOptions” 我在下面有一个散列数据结构 %fruit=( banana => [ 1, "yellow" ], cherry => [ 2, "dark red" ], strawberry => [ 3, "red" ], ); 关键是水果的名字 然后我想用“GetOptions”来表示水果的“name”、“number”和“color” 请告诉我如何使用GetOptions 我想用like-n来搜索name,用-

我曾经在散列数组中使用“GetOptions”

我在下面有一个散列数据结构

%fruit=(
    banana => [ 1, "yellow" ],
    cherry => [ 2, "dark red" ],
    strawberry => [ 3, "red" ],
);
关键是水果的名字

然后我想用“GetOptions”来表示水果的“name”、“number”和“color”

请告诉我如何使用GetOptions

我想用like-n来搜索name,用-I来搜索number,用-c来搜索color


请让我知道…:(

我认为您不太了解
GetOptions
的功能

它解析您传入的选项

以你为例:

> myprog.pl --name banana 
在您的计划中,您将:

my $name;
GetOptions("name=s" => \$name);
然后,您的
$name
将包含
香蕉


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

%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';
test.pl -i 3
从那里,您可以遍历数组并创建哈希引用:

my %fruitHash;
my $count = 1;
foreach my $value (@fruit) {
    my ($fruit, $color) = split(/=/, $value);
    $fruit{$fruit}=>[0] = $count,
    $fruit{$fruit)=>[1] = $color,
}
无法让GetOptions理解命令行选项是对两个成员数组的引用


我正在尝试使用getoptions进行名称、数字和颜色搜索。例如,在命令行中键入名称类似于“banana”的“-n”,然后searchinng banana=>[1,“黄色”]

这不是你的问题。这很简单:

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并给出一条漂亮的错误消息)


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

因为您没有提供如何调用脚本的示例,所以我假设如下:

$fruit[0] = 'banana=yellow';
$fruit[1] = 'cherry=dark red';
$fruit[2] = 'strawberry=red';
test.pl -i 3
给我们

strawberry, 3, red
cherry, 2, dark red

给我们

strawberry, 3, red
cherry, 2, dark red

给我们

banana, 1, yellow

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

GetOptions
用于处理命令行选项。您到底想做什么?我正在尝试使用GetOptions进行名称、数字和颜色搜索。例如,在命令行中键入“-n”和类似“banana”的名称,然后搜索ng banana=>[1,“黄色”]…@user712390:这不是你在问的问题。如果你想能够解析“-n1”或“-cred”作为命令行输入,您以一种非常简单的方式使用GetOptions。请参阅。用您想要完成的内容重申您的问题。示例命令行和输出将使问题变得更加清晰,而不是我的迷你rant,但为什么从事编程的人不知道指定示例输入和所需的输出状态?1)命令行是什么样子的,2)您想对输入做什么?
#!/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;
      }
   }
}