在子例程中取消引用数组

时间:2013-10-04 21:09:39

标签: 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";
  }

print语句打印此警告:

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

3 个答案:

答案 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=@_;(即其中的元素数)。