将变量传递给Perl子例程

将变量传递给Perl子例程,perl,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 { } 我

我想将以下变量传递给子程序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
{

}

我尝试了
$\u0]
@
,但似乎没有正确地将变量传递给子例程。

有几种方法可以做到这一点(就像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);

另一种方法是,通过引用传递数组,然后复制它,以避免在编辑时更改原始数组

sub mySubroutine
{
    ## Retrieve name
    my $name = shift;

    ## Retrieve age
    my $age = shift;

    ## Retrieve list reference
    my $refList = shift;

    ## De-reference the list's scalar
    my @list = @{$refList};
    # Good to go
}

## Function call
mySubroutine($name, $age, \@list);

为了更好地理解,请参阅(Perl子例程)。

另一个选项是,只要您只传递一个数组,通常将其作为最后一个元素按值传递:

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中阵列的更改会影响原始副本,但是:

sub array_by_ref {
    my $array_ref = shift;

    foreach my $element (@$array_ref)
    {
       # Changing $element changes @original_array!
    }
}

array_by_ref(\@original_array);

我没有看到任何$name或$age。如何调用子例程?您的示例代码遗漏了一些变量,最重要的是函数调用。您是否像这样编写mySubroutine($name,$age,\@多维数组)?请标记正确答案。如果您这样做,最好是:
my$name=shift;我的$age=shift。。。等等。除非您特别需要副本,否则在sub中使用数组引用比制作副本更好。同意,但我不知道OP是否要修改原始数组。不客气。不要忘记将答案标记为正确,欢迎使用SO:)