Аргументы в подпрограмму передаются в массиве. Похоже, вы уже понимаете, что, поскольку вы наращиваете свои аргументы в @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'
];
Помогает ли это?
Не было бы проще использовать хеш в качестве единственного аргумента? например '% hash = {agr0 => $ arguments [0], ctrl => @controller, mem => @member}' – yco
@YoannCouble Ваш код не работает - используйте '% hash = (...)' или '$ hash_ref = {...} ' – Xaerxess
@Xaerxess Ooops, верно, извините. – yco