Подтвердить что ты не робот

Передача переменных в подпрограмму 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] и @_, но я, похоже, не правильно передал переменные, переданные в подпрограмму.

4b9b3361

Ответ 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).