在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
答案 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);