我曾经在哈希数组中使用'GetOptions'。
我在下面有一个哈希数据结构。
%fruit=(
banana => [ 1, "yellow" ],
cherry => [ 2, "dark red" ],
strawberry => [ 3, "red" ],
);
关键是水果的名称。
然后我想对'水果'名称','数字'和'颜色'使用'GetOptions'。
您能否告诉我如何使用GetOptions ...?
我想使用-n来搜索名称,使用-i作为数字,使用-c作为颜色。
请让我知道...... :(
答案 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;
}
}
}
如果这不是您所需要的,请告诉我们更多信息!