2

考虑:

sub abc()
{

}

abc(@array, $a);

我如何访问@array$a子程序abc()

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

4

4 回答 4

6

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

如果您想避免在列表上下文中使用数组时总是发生展开,请改用对数组的引用。对数组和哈希的引用是使用\. 所以调用你的函数,如:

abc(\@array, $a);

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

于 2012-10-18T09:04:04.523 回答
6

你有两个选择:

  1. 首先传递标量变量(肮脏的方式)

    abc($a, @array);
    

    然后接收子程序中的参数为

    my ($a, @array) = @_;
    
  2. 通过在数组变量之前添加反斜杠将数组作为引用传递(推荐)

    abc(\@array, $a);
    

    然后接收子程序中的参数为

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

    并取消引用 $array_ref

    my @array = @$array_ref;
    

有关perlref的更多信息。

于 2012-10-18T09:19:15.143 回答
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 中所做的更改影响原始数组,则制作一个引用数组的副本。

于 2012-10-18T11:37:51.543 回答
0

如果您传递数组引用而不是 Oleg V. Volkov 提到的数组,那就太好了

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

abc(\@array,$a);
于 2012-10-18T09:11:17.360 回答