2015-04-14 3 views
-1

Я написал функцию, и вызов функции работает как ожидалось, и я получаю желаемый результат, когда я вызываю вызов функции. Однако я хотел бы улучшить его, сделав пару изменений. На данный момент функция принимает в качестве аргументов 'ip' и 'service names'.Perl: Передача массивов в качестве аргументов

Усовершенствование: 1) Когда я делаю вызов функции, и если я не передаю какие-либо службы в качестве аргументов, я хочу, чтобы функция принимала все службы в качестве аргументов сама по себе Имеется всего 5 служб. например, service1, service2, service3, service 6, service8. (Это всего лишь примеры names.it могут быть любыми). Итак, каково изменение, которое мне нужно сделать для функции, чтобы гарантировать, что если службы не передаются в качестве аргументов, функция должна принимать все службы в качестве аргументов.

Например вызов функции:

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

Таким образом, когда вышеуказанная вызов функции производится все функции должны принимать все услуги в качестве аргументов

Enhancement.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 

ответ

0

Вам просто нужно проверить, определена ли ссылка на массив, и по умолчанию значения, используемые, если нет, так что можно было бы написать

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

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

    ... 
} 

Но вы уверены, что вы хотите передать массив ссылку? Пока это последние часть ваших пройденных параметров, вы можете использовать голый список. Вы бы сделать это, просто назначая массив после параметра $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'); 
+0

Эти значения разделяются запятой. услуги qw/service1 сервис2 сервис3 сервис6 сервис8 /; } – user3587025

+0

Это так, как я их написал. 'qw/service1 service2 service3 service6 service8 /' такой же, как '('service1', 'service2', 'service3', 'service6', 'service8')', но гораздо приятнее вводить и читать. Вы также можете вызвать свой метод как «health_check (qw/ip service1 service2 /)» – Borodin

+0

Я получаю следующую ошибку. Нечетное количество элементов в анонимном хэше на странице Services.pm 126 – user3587025