Perl-具有两个数组参数的函数

时间:2019-02-27 10:37:46

标签: arrays function perl

在Perl中使用函数时遇到麻烦。

我的函数有2个参数,它们是数组:

sub get_coordinate {
    my (@array_col, @array_lin) = (@_);

    do some stuff
}

我这样称呼:

    $index_col                  = int(rand(10));
    $index_lin                  = int(rand(10));
    @array_col                  = (0,0,0,0,0,0,0,0,0,0);
    @array_lin                  = (0,0,0,0,0,0,0,0,0,0);
    $array_col[$index_col]      = 1;
    $array_lin[$index_lin]      = 1;

    get_coordinate(@array_col, @array_lin);

我的问题是我收到错误消息:在@array_lin中使用数字eq(==)中的未初始化值         switch.pl第82行(#1)     (W未初始化)使用未定义的值,就好像它已经     定义。它被解释为“”或0,但可能是一个错误。     要消除此警告,请为变量分配一个已定义的值。

我不明白为什么@array_col初始化为不是@array_lin。

当我以这种方式在函数内打印@array_col和@array_lin时:

print "@array_col\n@array_lin\n";

我得到:0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0

有什么想法吗?

Thx, SLP

2 个答案:

答案 0 :(得分:8)

在Perl中,所有列表都是平坦的。这两个列表是等效的。

( 1, 2, ( 3, 4, ( 5 ), (6, 7), 8), (), )
( 1, 2, 3, 4, 5, 6, 7, 8 )

当采用多个数组并将它们粘贴在列表中时,也会发生同样的事情。

my @foo = (1, 2, 3);
my @bar = (4, 5, 6);
my @new = (@foo, @bar); # 1, 2, 3, 4, 5, 6

将事物传递给函数时,这些事物将变成参数列表。因此,这两个数组都将以一个列表结尾,例如上面的@foo@bar

frobnicate(@foo, @bar);

当您在列表上下文中分配内容时,整个列表将从左到右分配。对于左侧列表中的标量,这意味着它们将获得其值。但是只要有一个数组,这就会很贪婪。它将吸收所有剩余的值。

my ($one, $two, @rest, $will_be_undef) = (1, 2, 3, 4, 5, 6);

将按以下方式分配值:

$one = 1;
$two = 2;
@rest = ( 3, 4, 5, 6 );
$will_be_undef = undef;

传递两个数组所需要做的就是获取引用,然后在我们的函数中取消引用。

frobnicate( \@foo, \@bar );

sub frobnicate {
    my ($first_array, $second_array) = @_;

    my @foo = @{ $first_array };
    my @bar = @{ $second_array };

    ...
}

答案 1 :(得分:2)

分配几个数组(或散列)并不能满足您的要求:

my (@array1, @array2) = ...

第一个数组获取所有元素。它应该如何知道在哪里停下来?

您可以改用数组引用:

sub get_coordinate {
    my ($arr1, $arr2) = @_;
    my @arr1 = @$arr1;
    my @arr2 = @$arr2;
    ...
}
get_coordinate(\@array1, \@array2);