我正在尝试将数组和标量传递给子例程。但阵列解除引用似乎存在问题。以下是我的代码
use strict;
use warnings;
my @arr=("95,100", "102,65", "92,34");
my $len=100;
avg($len,\@arr);
sub avg{
my $len = shift;
my $array=@_;
my @new=@{$array};
print @new,"\n";
}
print语句打印此警告:
Can't use string ("1") as an ARRAY ref while "strict refs" in use at test_arr.pl line 13.
答案 0 :(得分:6)
在标量上下文中使用数组时,数组将返回其中的元素数。
所以当你说
时my $array = @_;
$array
的值是数字1,因为@_
中有一件事。 (你已经shift
关闭了第一个标量。)
所以要解决这个问题,你可以做到
sub avg {
my $len = shift;
my $array_ref = shift;
my @new = @$array_ref;
...
}
或者您可以使用并行列表分配
sub avg {
my ( $len, $array_ref ) = @_;
...
或者你可以直接从@_
中抽出参考
sub avg {
my $len = shift;
my @new = @{ $_[0] };
...
我喜欢中间选项。
答案 1 :(得分:3)
将您的代码更改为:
#!/usr/bin/perl
use strict;
use warnings;
my @arr = ("95,100", "102,65", "92,34");
my $len = 100;
avg($len, \@arr);
sub avg{
my $len = shift;
my $array = $_[0]; # Pass the 2nd element of original argument list
# which is now the 1st element of the argument list
# (which is a reference to @arr), not the list itself.
my @new = @{$array};
print @new, "\n";
}
答案 2 :(得分:2)
my $array=@_;
不正确,您应该使用my $array=shift;
或合并使用my ($len, $array) = @_;
。
您已通过@_
获得标量值$array=@_;
(即其中的元素数)。