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

SLP*_*SLP 2 arrays perl function

我在Perl中使用函数时遇到了麻烦.

我的函数有2个参数是数组:

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

    do some stuff
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

    $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);
Run Code Online (Sandbox Code Playgroud)

我的问题是我收到错误消息:在switch.pl第82行(#1)的数字eq(==)中使用@array_lin中未初始化的值(未初始化)未使用的值如同已经定义的那样使用.它被解释为""或0,但也许这是一个错误.要禁止此警告,请为变量分配定义的值.

我不明白为什么@array_col被初始化而不是@array_lin.

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

print "@array_col\n@array_lin\n";
Run Code Online (Sandbox Code Playgroud)

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

任何的想法 ?

谢谢,SLP

sim*_*que 8

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

( 1, 2, ( 3, 4, ( 5 ), (6, 7), 8), (), )
( 1, 2, 3, 4, 5, 6, 7, 8 )
Run Code Online (Sandbox Code Playgroud)

当拿几个数组并将它们粘在一个列表中时,也会发生同样的事情.

my @foo = (1, 2, 3);
my @bar = (4, 5, 6);
my @new = (@foo, @bar); # 1, 2, 3, 4, 5, 6
Run Code Online (Sandbox Code Playgroud)

当你将东西传递给一个函数时,这些东西会变成一个参数列表.因此,阵列将二者在一个列表中结束,像@foo@bar上方.

frobnicate(@foo, @bar);
Run Code Online (Sandbox Code Playgroud)

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

my ($one, $two, @rest, $will_be_undef) = (1, 2, 3, 4, 5, 6);
Run Code Online (Sandbox Code Playgroud)

值将按如下方式分配:

$one = 1;
$two = 2;
@rest = ( 3, 4, 5, 6 );
$will_be_undef = undef;
Run Code Online (Sandbox Code Playgroud)

传递两个数组需要做的是获取引用,并在我们的函数中取消引用它们.

frobnicate( \@foo, \@bar );

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

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你详细解答 (2认同)