2013-06-05 3 views
0

Я новичок в Perl и хотел бы знать, если следующая логика работает в Perl: -Perl необязательный аргумент командной строки

Я должен выполнить команду с помощью сценария Perl с некоторыми аргументами, и мне нужно подготовить что аргументы список, некоторые из аргументов также необязательно (может или не может представить)

push(@args, $arguments[0]); 
push(@args, @controller); 
push(@args, @member); 

из приведенных выше рассуждений у меня есть аргументы [0], что требуется, и контроллер и член не являются обязательными. Мое сомнение в том, что аргумент «controller» отсутствует, мне нужно поставить «null» или по умолчанию Perl позаботится об этом?

Редактировать: - Чтобы прояснить вопрос, у меня нет аргумента «controller», но есть аргумент «member».

Благодаря -Arpit

+2

Не было бы проще использовать хеш в качестве единственного аргумента? например '% hash = {agr0 => $ arguments [0], ctrl => @controller, mem => @member}' – yco

+0

@YoannCouble Ваш код не работает - используйте '% hash = (...)' или '$ hash_ref = {...} ' – Xaerxess

+0

@Xaerxess Ooops, верно, извините. – yco

ответ

1

Аргументы в подпрограмму передаются в массиве. Похоже, вы уже понимаете, что, поскольку вы наращиваете свои аргументы в @args.

Если ваша подпрограмма просто ожидает список аргументов аргументов, то есть некоторые проблемы с вашим подходом.

Во-первых, как вы поняли, если вы нажмете пустой массив на массив, вы не получите никаких элементов, добавленных в ваш массив @args. И это запутает вашу подпрограмму. Это достаточно просто, чтобы проверить это с помощью Data :: Dumper.

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 
use Data::Dumper; 

my @arguments = ('Arg1'); 
my @controller; 
my @member; 
my @args; 

push(@args, $arguments[0]); 
push(@args, @controller); 
push(@args, @member); 

say Dumper \@args; 

Результат выглядит следующим образом:

$ ./args 
$VAR1 = [ 
      'Arg1' 
     ]; 

Но вы также имеют противоположную проблему. Если @controller или @member содержат более одного элемента, тогда ваш массив аргументов перепутается, слишком много в нем.

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 
use Data::Dumper; 

my @arguments = ('Arg1'); 
my @controller = ('C1', 'C2'); 
my @member = ('M1', 'M2'); 
my @args; 

push(@args, $arguments[0]); 
push(@args, @controller); 
push(@args, @member); 

say Dumper \@args; 

Что дает:

$ ./args2 
$VAR1 = [ 
      'Arg1', 
      'C1', 
      'C2', 
      'M1', 
      'M2' 
     ]; 

Решение обеих этих проблем является то же самое. Если вы хотите ровно один элемент от @controller и @member, тогда попросите exaccty один элемент. Если их слишком мало, вы получите undef в массиве, и если их слишком много, то вы получите первый.

Пустые массивы:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 
use Data::Dumper; 

my @arguments = ('Arg1'); 
my @controller; 
my @member; 
my @args; 

push(@args, $arguments[0]); 
push(@args, $controller[0]); 
push(@args, $member[0]); 

say Dumper \@args; 

Что дает:

$ ./args3 
$VAR1 = [ 
      'Arg1', 
      undef, 
      undef 
     ]; 

Overfull массивы:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 
use Data::Dumper; 

my @arguments = ('Arg1'); 
my @controller = ('C1', 'C2'); 
my @member = ('M1', 'M2'); 
my @args; 

push(@args, $arguments[0]); 
push(@args, $controller[0]); 
push(@args, $member[0]); 

say Dumper \@args; 

Что дает:

$ ./args4 
$VAR1 = [ 
      'Arg1', 
      'C1', 
      'M1' 
     ]; 

Помогает ли это?

+0

+1: Отображение OP, как проверить и выяснить ответ для себя. –

0

Почему @controller и @member массивы?

Не могли бы вы передать более одного контроллера (если имеется)? Или, вы считали, что оба аргумента в push должны быть массивами?

Второй аргумент может быть скалярным значением. Тест перед нажатием:

push(@args, $arguments[0]); 
push(@args, $controller) if defined $controller; 
push(@args, $member)  if defined $member; 

Это приведет к пустым/нулевым строкам, но если аргументы не определены. Если вы не хотите их, если эти значения пустые или нулевые или нулевые значения, вы можете сделать это:

push(@args, $arguments[0]); 
push(@args, $controller) if $controller; 
push(@args, $member)  if defined $member; 

И, вы можете использовать join воссоединиться свои аргументы обратно в одну строку:

my $full_command = join " ", $command, @args; 

my $errors = system qw($full_command); 

Или, если вам не нужна оболочка для исполнения:

my $errors = system $command, @args; 

Это будет выполнять вашу команду без оболочки.

Смежные вопросы