Perl:将数组作为参数传递

Perl : Passing Arrays as arguments

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

增强:1)当我进行函数调用时,如果我没有将任何服务作为参数传递,我希望函数本身将所有服务作为参数 总共有5个服务。例如服务 1、服务 2、服务 3、服务 6、服务 8。(这些只是示例 names.it 可以是任何东西)。那么我需要对函数进行哪些更改以确保如果服务未作为参数传递,函数必须将所有服务作为参数。

例如函数调用:

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

所以当调用上述函数时,所有函数都必须将所有服务作为参数

Enhancement.2) 用户希望在函数调用中将一个或两个服务作为参数传递。目前我将它们存储在一个数组中。像 @services = ('service1','service2','service3') 一样。我不想将它们存储在 array.instead 中,我想直接将服务作为参数传递,如下所示。有什么建议吗

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

你只需要检查是否定义了数组引用,如果没有则默认使用的值,所以你会写

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

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

  ...
}

但是您确定要传递数组 reference 吗?只要它是您传递的参数的 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');