Perl:传递数组作为参数

时间:2015-04-14 00:35:23

标签: perl function subroutine

我编写了一个函数,函数调用按预期工作,当我进行函数调用时,我得到了所需的输出。但是,我想通过对其进行一些更改来增强它。现在,该函数将'ip''service names'作为参数。

增强:1)当我进行函数调用并且如果我没有传递任何服务作为参数时,我希望函数将所有服务作为参数单独使用 共有5项服务。比如说service1,service2,service3,service 6,service8。(这些只是样本名称。它可以是任何东西)。那么我需要对函数进行哪些更改以确保如果服务不作为参数传递,则该函数必须将所有服务作为参数。

例如函数调用:

$self->{'status_of_services'} = $self->{'services_obj'}->health_check('ip')

因此,当进行上述函数调用时,所有函数必须将所有服务作为参数

增强.2)用户希望在函数调用中传递一个或两个服务作为参数。目前我将它们存储在一个数组中。像@services = ('service1','service2','service3')。我不想将它们存储在数组中。我想直接将服务作为参数传递,如下所示。请提出任何建议。

eg : $self->{'status_of_services'} = $self->{'services_obj'}->health_check('ip', [service1 ,service2]);

功能:

sub health_check{

     my ($self, $ip, @service_name)  = @_;

     $self->{'health_checks_obj'}  = ServiceManager->new( ip => $ip );

     $self->{'services_status'}  = $self->{'health_checks_obj'}->isRunning( {service => @service_name} );

      sleep(5);

     if ( not $self->{'services_status'} ) {
         $self->{'health_checks_obj'}->start( {service => @service_name ,  timeout => '30'} );

           sleep (3);
       }

    return  1 ;
}

函数调用:

my @services = ('service1', 'service2', 'service3','service4','service5');

     $self->{'status_of_services'} = $self->{'services_obj'}->health_check('ip', @services);

     INFO (' Health check result is : ' . $self->{'status_of_services'} );

输出:

 Health check result is : 1

1 个答案:

答案 0 :(得分:0)

您只需要检查数组引用是否已定义,如果没有,则默认使用值,因此您可以编写

sub health_check{
  my ($self, $ip, $services)  = @_;

  my @services;
  if ( $services ) {
    @services = @$services;
  }
  else {
    @services = qw/ service1 service2 service3 service6 service8 /;
  }

  ...
}

但是您确定要传递数组引用吗?只要它是传递参数的 last 部分,您就可以使用裸列表。你可以通过在$ip参数之后分配一个数组来做到这一点,如果它是空的则默认它,就像这样

sub health_check{
  my ($self, $ip, @services)  = @_;

  unless ( @services ) {
    @services qw/ service1 service2 service3 service6 service8 /;
  }

  ...
}

你可以这样称呼它

$self->{'services_obj'}->health_check('ip', 'service1', 'service2');

$self->{'services_obj'}->health_check('ip');