Getopt :: Long Нажатие нескольких значений в опции хеширования - PullRequest
3 голосов
/ 19 октября 2010

Например:

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 ]

2 голосов
/ 19 октября 2010

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

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 голосов
/ 19 октября 2010
use strict;
use warnings;
use Getopt::Long;

my @files;

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

Side Примечание:

Пример в задаче не имеет смысла.Если все имена файлов будут помещены в клавишу «имя файла», имеет ли смысл иметь хэш?

0 голосов
/ 19 октября 2010

Вы не включили use warnings;.Если бы вы это сделали, вы бы увидели, что на самом деле вы ничего не объявляете с этой строкой:

%file;

Вы бы хотели, чтобы это было

my %file;

Но, как сказал другой автор,вы все равно не хотите этого в хеше.Я просто указываю на значение use warnings;.

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