【问题标题】:Passing variables to a Perl subroutine将变量传递给 Perl 子例程
【发布时间】:2016-05-05 23:04:44
【问题描述】:

我想将以下变量传递给子程序 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]@_,但我似乎没有正确地将变量传递给子例程。

【问题讨论】:

  • 我没有看到任何 $name 或 $age。你是怎么调用子程序的?
  • 您的示例代码遗漏了一些变量,最重要的是 - 函数调用。
  • 你写过这样mySubroutine($name, $age, \@multidimensional_array)吗?
  • 请标记正确答案。

标签: perl


【解决方案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);

【讨论】:

  • 最好在你的 sub 中使用数组引用而不是制作副本,除非你特别需要副本。
  • 同意,但我不知道OP是否要修改原始数组。
  • 不客气。不要忘记将答案标记为正确,欢迎来到 SO :)
【解决方案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 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's scalar
        my @list = @{$refList};
        # Good to go
    }
    
    ## Function call
    mySubroutine($name, $age, \@list);
    

    为了更好的理解,请参考perlsub(Perl 子例程)。

    【讨论】:

    • 如果你这样做,最好:my $name = shift; my $age = shift;...等
    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多