Передача переменных в подпрограмму Perl
Я хотел бы передать следующие переменные для подпрограммы mySubroutine, $name, $age
, а затем этот многомерный массив:
$name = "jennifer";
$age = 100;
$list[0][0] = "TEST NAME 2";
$list[0][1] = "TEST GROUP 2";
$[0][2] = 10;
$[1][0] = "TEST NAME 2";
$[1][1] = "TEST GROUP 2";
$[1][2] = 2;
подпрограммы:
sub mySubroutine
{
}
Я пробовал $_[0]
и @_
, но я, похоже, не правильно передал переменные, переданные в подпрограмму.
Ответы
Ответ 1
Существует несколько способов сделать это (как и большинство вещей в Perl). Я лично делаю это так:
sub mySubroutine
{
# Get passed arguments
my ($name, $age, $refList) = @_;
# Get the array from the reference
my @list = @{$refList};
# Good to go
}
# You need to pass @list as reference, so you
# put \@list, which is the reference to the array
mySubroutine($name, $age, \@list);
Ответ 2
Другой вариант, если вы только передаете один массив, должен передать его обычно по значению в качестве последнего элемента:
sub scalars_and_one_array {
my $name = shift;
my $age = shift;
foreach my $element (@_)
{
# Do something with the array that was passed in.
}
}
scalars_and_one_array($name,$age,@array);
Однако наиболее эффективно избегать любой дополнительной копии массива, используя только ссылку в суб. Это означает, что изменения в массиве в sub влияют на оригинал:
sub array_by_ref {
my $array_ref = shift;
foreach my $element (@$array_ref)
{
# Changing $element changes @original_array!
}
}
array_by_ref(\@original_array);
Ответ 3
Другой способ, который передает массив по ссылке, но затем копирует его, чтобы избежать изменения оригинала при его редактировании.
sub mySubroutine
{
## Retrieve name
my $name = shift;
## Retrieve age
my $age = shift;
## Retrieve list reference
my $refList = shift;
## De-reference the list scalar
my @list = @{$refList};
# Good to go
}
## Function call
mySubroutine($name, $age, \@list);
Для лучшего понимания обратитесь к perlsub (подпрограммам Perl).