这是我在stackoverflow上的第一篇文章。 :)
我正在尝试使用GetOpt :: Long来解决这个问题。
./ myscript -m / abc -m / bcd -t nfs -m / ecd -t nfs ...
-m是挂载点,-t是文件系统的类型(可以放置,但不是必需的)。
Getopt::Long::Configure("bundling");
GetOptions('m:s@' => \$mount, 'mountpoint:s@' => \$mount,
't:s@' => \$fstype, 'fstype:s@' => \$fstype)
这是不对的,我无法配对正确的mount和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 :(得分: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 :(得分: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.
编辑:根据要求添加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 / bar / baz
ext4:/ foo
nfs:/ abc,/ bcd
ntfs:/ bar,/ baz
请注意,输入按文件系统类型排序,然后按挂载点排序。这与OP的解决方案相反。