Getopt :: Long在哈希选项中推送多个值

时间:2010-10-19 12:57:32

标签: perl

例如:

use Getopt::Long;
%file ;
GetOptions('file=s%' =>
sub { push(@{$file{$_[1]}}, $_[2]) });

use Data::Dumper ;
print Dumper %file ;


print  @{$file{filename}} ;

my @file_array = @{$file_ref};

print "==\n @file_array == ";

我可以执行并且正常工作:

 perl multipls.pl  --file filename=a.txt  --file  filename=b.txt filename=c.txt

我正在寻找

 perl multipls.pl  --file filename=a.txt  filename=b.txt filename=c.txt

如何实现这一目标?

3 个答案:

答案 0 :(得分:2)

use strict;
use warnings;
use Getopt::Long;

my @files;

GetOptions ( "file=s{,}" => \@files );

旁注:

问题中的例子并没有多大意义。如果要将所有文件名推送到'filename'键,那么有一个哈希是否有意义?

答案 1 :(得分:2)

我不知道如何说服Getopt::Long完全按照你的要求行事,但我经常使用shell引用将几个项目组合成一个字符串,然后将字符串拆分成一个数组:

use strict;
use warnings;
use Data::Dumper;
use Getopt::Long;

my @files;
my $filelist;
GetOptions('file=s' => \$filelist);

if ($filelist) {
    $filelist =~ s/^\s+//; # Remove any leading whitespace
    @files = split /\s+/, $filelist;
}
print Dumper(\@files);

__END__


perl multipls.pl --file "filename=a.txt filename=b.txt"

$VAR1 = [
          'filename=a.txt',
          'filename=b.txt'
        ];

答案 2 :(得分:0)

您没有启用use warnings;。如果你这样做了,你会发现你实际上没有用这一行声明任何内容:

%file;

你希望那是

my %file;

但正如另一张海报所说的那样,无论如何你都不想要它。我只是指出use warnings;的价值。