一个数组和一个变量作为Perl子程序中的参数

时间:2012-10-18 09:00:06

标签: perl

考虑:

sub abc()
{

}

abc(@array, $a);

如何在子例程@array中访问$aabc()

我知道$_[0]$_[1],但我不确定是否可以将它用于数组。

4 个答案:

答案 0 :(得分:6)

使用@_数组访问子参数。第一个参数是$_[0],第二个参数是$_[1]等。在这种特殊情况下,您的数组将展开为其元素列表,因此$_[0]$array[0]$_[1]$array[1],然后在所有这些元素之后,@_的最后一个元素将是$a的值。

如果要避免在列表上下文中使用数组时始终发生展开,请改为使用对数组的引用。使用\创建对数组和哈希的引用。所以请调用您的函数:

abc(\@array, $a);

之后,$_[0]将引用@array$_[1]将引用$a。要通过引用访问数组元素,请使用->运算符。 $_[0]->[2]$array[2]相同。实际上你甚至可以放弃->,只要它在括号之间,所以$_[0][2]也可以。请参阅perlref中有关参考文献的详细信息。

答案 1 :(得分:6)

您有两种选择:

  1. 首先传递标量变量(脏路)

    abc($a, @array);
    

    然后在子程序中接收参数

    my ($a, @array) = @_;
    
  2. 通过在数组变量(推荐)

    之前添加反斜杠将数组作为参考传递
    abc(\@array, $a);
    

    然后在子程序中接收参数

    my ($array_ref, $a) = @_;
    

    取消引用$ array_ref

    my @array = @$array_ref;
    
  3. 有关perlref的更多信息。

答案 2 :(得分:2)

其他答案解释了两种基本方法。但是,重要的是要注意两者之间存在很大差异:当您通过引用传递数组时,您对其进行的任何更改也会更改原始数组。这是一个例子:

use warnings;
use strict;

my @array = (1, 2, 3, 4, 5);

sub by_ref
{
    my $array_ref = $_[0];
    @$array_ref = (0, 0, 0);
    print "Array inside by_ref: @$array_ref\n";
}

sub by_val
{
    my @array_copy = @_;
    @array_copy = (0,0,0);
    print "Array inside by_val: @array_copy\n";
}

by_val(@array);

print "Original array after calling by_val: @array\n";

by_ref(\@array);

print "Original array after calling by_ref: @array\n";

如果您通过引用传递,则需要记住此行为,如果您不希望在sub中进行更改以影响原始数据,则制作引用数组的副本。

答案 3 :(得分:0)

如果你传递数组引用而不是像Oleg V. Volkov所提到的数组那样会很好

sub abc()
{
    my ( $array, $a ) = @_; #receiving the paramters
    my @arr = @{$array}; # dereferencing the array
}

abc(\@array,$a);