我通过传递一些命令行选项来调用我的perl脚本。如果用户在调用脚本时未传递所需的命令行选项,则脚本应终止。目前,我正在使用if statement
进行简单检查。如果必需参数大于10,则使用If语句看起来很笨拙。我只是想知道是否有更好的方法来做这件事,而不仅仅是使用if语句。
命令行选项:
sub startup {
my ($self) = @_;
GetOptions (
"endpoint|e=s" => \$self->{'endpoint'},
"port|pt=s" => \$self->{'port'},
"client|c=s" => \$self->{'client'},
"client_interface|ci=s" => \$self->{'client_interface'},
"origin|o=s" => \$self->{'origin'},
"origin_interface|oi=s" => \$self->{'origin_interface'},
"customer_id|cid=s" => \$self->{'customer_id'},
"endpoint_id|eid=s" => \$self->{'endpoint_id'},
) || $self->abort( "Invalid command line options.
Valid options are endpoint,port,client,client_interface,
origin,origin_interface,customer_id,endpoint_id");
#Terminate脚本执行如果--endpoint ip和--customer id和--client未通过
if ( !$self->{'endpoint'} || !$self->{'customer_id'} || !$self->{'client'}){
$self->abort( '[Startup] endpoint customer and client are required arguments.'
. 'Please provide --endpoint and --customer id and -- client ');
}
调用脚本的命令:
./testframework --scriptname -- --endpoint=198.18.179.42 --port=5000 --client=1.1.1.1 --client_interface=2.2.2.2 --origin=3.3.3.3 --origin_interface= --Outertunnel=Tunnel0 --Innertunnel=Tunnel2 --customer_id=900010 --endpoint_id=2859588
答案 0 :(得分:7)
下面的版本会在提供更具体的错误消息时消除一些笨拙。
my @required = qw( endpoint customer_id client );
if ( my @missing = grep { !$self->{$_} } @required ) {
$self->abort("[Startup] Missing required arguments: @missing");
}
答案 1 :(得分:2)
一种方法是使用List::Util中的all
:
unless ( all { defined $self->{$_} } qw(endpoint customer_id client) ){
# error
}
如果您没有最新版本的List::Util
,请使用List::MoreUtils
答案 2 :(得分:2)
您可以检查一下哈希中是否有正确数量的已定义键?
my @options = grep { defined $self->{$_} } keys %{$self};
die "Missing options\n" unless @options == 10;
或者,如果您希望使用语句更明确:
for my $opt (keys %{$self}) {
die "Missing option --$opt\n" unless defined $self->{$opt};
}