2010-10-19 4 views
3

Для примера:Getopt :: Long Нажимать несколько значений в опции хэш

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 

Как добиться этого?

ответ

2

Я не знаю, как убедить 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
use strict; 
use warnings; 
use Getopt::Long; 

my @files; 

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

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

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

+0

Когда Я запускаю ваш код с командной строкой OP, массив содержит только первый файл, а не все 3 файла. – toolic

+1

@toolic: Можете ли вы попробовать с параметром 's {,}'? – Zaid

+0

Да, это работает. – toolic

0

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

вы хотели бы, что быть

my %file; 

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

Смежные вопросы