2010-10-19 3 views
3

Exemple:Getopt Long Pousser plusieurs valeurs dans une option de hachage

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 == "; 

je peux exécuter et travail:

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

Je cherche

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

Comment accomplir ceci?

Répondre

2

Je ne sais pas comment convaincre Getopt::Long de faire exactement ce que vous demandez, mais je l'utilise souvent shell citant pour regrouper plusieurs éléments dans une chaîne, puis diviser la chaîne en un tableau:

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 Note:

L'exemple le problème ne fait pas vraiment de sens. Si tous les noms de fichiers vont être poussés à la clé 'filename', est-ce logique d'avoir un hash?

+0

Lorsque Je cours votre code avec la ligne de commande de l'OP, le tableau contient seulement le 1er fichier, pas tous les 3 fichiers. – toolic

+1

@toolic: Pouvez-vous l'essayer avec l'option 's {,}'? – Zaid

+0

Oui, ça fonctionne. – toolic

0

Vous n'avez pas use warnings; activé. Si vous avez fait, vous verriez que vous n'êtes pas vraiment quoi que ce soit avec cette déclarez ligne:

Vous voudriez que pour être

my %file; 

Mais comme un autre dit, vous ne Je le veux de toute façon. Je ne fais que souligner la valeur de use warnings;.

Questions connexes