2016-07-12 7 views
3

Это мой первый пост в stackoverflow. :)Perl GetOpt :: Длинные множественные аргументы с необязательным параметром

Я пытаюсь решить этот сценарий с помощью GetOpt :: Long.

./myscript -m/а -m/BCD -t -m NFS/ECD -t ... NFS

-m является точкой монтирования и -t является типом файловой системы (может быть размещен, но это не обязательно).

Getopt::Long::Configure("bundling"); 
    GetOptions('m:[email protected]' => \$mount, 'mountpoint:[email protected]' => \$mount, 
      't:[email protected]' => \$fstype, 'fstype:[email protected]' => \$fstype) 

Это не так, я не в состоянии пара надлежащего крепления и FSType

./check_mount.pl -m /abc -m /bcd -t nfs -m /ecd -t nfs 
$VAR1 = [ 
      '/abc', 
      '/bcd', 
      '/ecd' 
     ]; 
$VAR1 = [ 
      'nfs', 
      'nfs' 
     ]; 

мне нужно заполнить неопределенный FSType например с значением «undef». лучшее решение для меня было бы получить хэш, такие как ...

%opts; 
$opts{'abc'} => 'undef' 
$opts{'bcd'} => 'nfs' 
$opts{'ecd'} => 'nfs' 

Возможно ли это? Спасибо.

+0

Вы пытаетесь применить очень специфический порядок для параметров, но я не думаю, что это очень часто или интуитивно понятно. Если бы я был пользователем вашего приложения, я бы ожидал, что '-m foo -t bar' будет таким же, как' -t bar -m foo'. Возможно, вы сможете сделать это с помощью Getopt :: Long, но я думаю, что другой дизайн будет лучше. – ThisSuitIsBlackNot

ответ

1

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

./script.pl --disk /abc --disk /mno=nfs -d /xyz=nfs 

... следующая приведет вас туда, где вы хотите быть (обратите внимание, что отсутствует тип будет отображаться как пустая строка, не undef):

use warnings; 
use strict; 

use Data::Dumper; 
use Getopt::Long; 

my %disks; 

GetOptions(
    'd|disk:s' => \%disks, # this allows both -d and --disk to work 
); 

print Dumper \%disks; 

Выход:

$VAR1 = { 
      '/abc' => '', 
      '/mno' => 'nfs', 
      '/xyz' => 'nfs' 
     }; 
+1

[Вам даже не нужно «разбить» его самостоятельно.] (Http: //perldoc.perl.org/Getopt/Long.html # Options-with-hash-values) Просто остерегайтесь точек монтирования, содержащих '='. – ThisSuitIsBlackNot

+0

Хороший звонок @ThisSuitIsBlackNot ... Я как-то пропустил этот раздел документов за годы :) Это удобно! (ответ обновлен) – stevieb

0

В разделе "Аргумент обратного вызова" из docs:

When applied to the following command line: 
    arg1 --width=72 arg2 --width=60 arg3 

This will call process("arg1") while $width is 80 , process("arg2") while $width is 72 , and process("arg3") while $width is 60. 

EDIT: Добавить MWE по запросу.

use strict; 
use warnings; 
use Getopt::Long qw(GetOptions :config permute); 

my %mount_points; 
my $filesystem; 

sub process_filesystem_type($) { 
    push @{$mount_points{$filesystem}}, $_[0]; 
} 

GetOptions('t=s' => \$filesystem, '<>' => \&process_filesystem_type); 

for my $fs (sort keys %mount_points) { 
    print "$fs : ", join(',', @{$mount_points{$fs}}), "\n"; 
} 

./test -t NFS/ABC/BCD -t ext4/Foo -t NTFS/бар/БАЗ

ext4:/Foo

NFS:/ABC,/BCD

: NTFS/бар,/Baz

Обратите внимание, что входы упорядочены по типу файловой системы, то монтирования. Это отпадает от решения OP.

+1

, возможно, это очень поможет, если вы предоставили рабочий пример, основанный на вопросе OPs ... – stevieb

+0

@stevieb Я добавил MWE в соответствии с запросом. Наверное, должен был это сделать раньше, но я чувствовал себя ленивым. – Tim

+0

Благодарим за решение! –

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

  • Нет связанных вопросов^_^