我有一个perl文件,基本上输入如下:
scheduleList.clear();
我正在执行此Perl文件,如下所示:
use strict;
use File::Copy;
use File::Path;
use Sys::Hostname;
use Getopt::Long;
use File::Spec;
use File::Compare;
use MIME::Base64;
use Digest::MD5 qw(md5_hex);
my %hmpParams;
my $keybindings;
my $keybindings1;
my $keybindings2;
my $filename;
my $osname;
my $copy="cp";
&parseCommandLineParams();
while ((my $k, my $v) = each %hmpParams ){
print($k . " = " . $v . "\n");
}
sub parseCommandLineParams(){
GetOptions ( 'bindings:s' => \$hmpParams{bindings},
'filename:s' => \$hmpParams{filename},
'key:s' => \$hmpParams{key},
'bindings1:s' => \$hmpParams{bindings1},
'bindings2:s' => \$hmpParams{bindings2}
);
}
输出:
perl test.pl "-bindings" "+WBAOBtud/UuM7uuCG2T+0ZvoCeuu/x24ovYkwjI2YM=" "-filename" "/tmp/keyMapperFile_2016-08-24-04:43:06" "-key" "avqijvmlf5ipq_5j0038opvhqmh_28jm8d913ptv0_3ie1ctia2cdqd" "-bindings1" "" "-bindings2" ""
我看到,只要选项的值中有前面的+符号,它就不会将其识别为值,而是将其视为选项。我该如何解决这个错误?这背后的原因是什么?
答案 0 :(得分:5)
您需要停用getopt_compat
选项,以防止前导+
被视为等同于--
:
getopt_compat
Allow "+" to start options. Default is enabled unless
environment variable POSIXLY_CORRECT has been set, in which
case "getopt_compat" is disabled.
,如
use Getopt::Long qw(:config no_getopt_compat);
或
use Getopt::Long;
Getopt::Long::Configure("no_getopt_compat");
答案 1 :(得分:1)
根本问题是,当您打算使用:s
时,您使用了=s
。既然你说省略--bindings
的论证是完全有效的,并且因为+
可以是一个有效的选项开头,它认为你的意思是使用--bindings
没有争论。
修正:
sub parseCommandLineParams {
GetOptions(
'bindings=s' => \$hmpParams{bindings},
'bindings1=s' => \$hmpParams{bindings1},
'bindings2=s' => \$hmpParams{bindings2},
'filename=s' => \$hmpParams{filename},
'key=s' => \$hmpParams{key},
)
or die("usage\n");
}
或
sub parseCommandLineParams {
GetOptions(
\%hmpParams,
'bindings=s',
'bindings1=s',
'bindings2=s',
'filename=s',
'key=s',
)
or die("usage\n");
}
顺便说一下,我还使用以下内容在POSIX兼容模式下使用Getopt :: Long:
use Getopt::Long qw( :config posix_default );
在此模式下,+
不被视为选项的开头。
perl test.pl \
--bindings +WBAOBtud/UuM7uuCG2T+0ZvoCeuu/x24ovYkwjI2YM= \
--filename /tmp/keyMapperFile_2016-08-24-04:43:06 \
--key avqijvmlf5ipq_5j0038opvhqmh_28jm8d913ptv0_3ie1ctia2cdqd \
--bindings1 '' \
--bindings2 ''