在子例程中取消引用数组

Mdh*_*ale 1 arrays perl subroutine

我试图将数组和标量传递给子程序.但阵列解除引用似乎存在问题.以下是我的代码

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

print语句打印此警告:

Can't use string ("1") as an ARRAY ref while "strict refs" in use at test_arr.pl line 13.
Run Code Online (Sandbox Code Playgroud)

fri*_*edo 6

在标量上下文中使用数组时,该数组返回其中的元素数.

所以当你说

my $array = @_;
Run Code Online (Sandbox Code Playgroud)

$array是1,因为@_它有一个东西.(你已经shift关闭了第一个标量.)

所以要解决这个问题,你可以做到

sub avg { 
    my $len = shift;
    my $array_ref = shift;

    my @new = @$array_ref;
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用并行列表分配

sub avg { 
    my ( $len, $array_ref ) = @_;
    ...
Run Code Online (Sandbox Code Playgroud)

或者你可以只猛拉出来的参考@_直接

sub avg { 
    my $len = shift;
    my @new = @{ $_[0] };
    ...
Run Code Online (Sandbox Code Playgroud)

我喜欢中间选项.