2016-07-12 11 views
3

これは私の最初の投稿ですstackoverflow。 :)Perl GetOpt :: Long複数の引数とオプションのパラメータ

私はこのシナリオをGetOpt :: Longで解決しようとしています。

./myscript -m/ABC -m/BCD -t NFS -m/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' 

はそれが可能です...としてハッシュますでしょうか?ありがとうございました。 docsの "引数のコールバック" セクションから

+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#オプション付きハッシュ値) '='を含むマウントポイントに注意してください。 – ThisSuitIsBlackNot

+0

良いコール@ThisSuitIsBlackNot ...私は何とか私の年のドキュメントのセクションを欠場しました:)それは便利です! (更新された回答) – stevieb

0

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 /バー/ bazに

のext4:/ fooの

NFS:/ ABC/BCD

NTFS:/バー、/バズ

入力はファイルシステムタイプ、次にマウントポイントとして注文されていることに注意してください。これはOPの解とは逆です。

+1

OPの質問に基づいて実際の例を提供すると、おそらく大いに役立ちます。 – stevieb

+0

@stevieb要求通りに私はMWEを追加しました。おそらくそれを前にしていたはずですが、私は怠惰だと感じていました。 – Tim

+0

ありがとうございました! –

関連する問題