perl中的命令行选项

时间:2016-05-17 15:03:30

标签: perl

我通过传递一些命令行选项来调用我的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 

3 个答案:

答案 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};
}