1

我正在尝试将数组和标量传递给子例程。但是数组取消引用似乎存在问题。下面是我的代码

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.
4

3 回答 3

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] };
    ...

我喜欢中间选项。

于 2013-10-04T21:13:30.983 回答
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";
  }
于 2013-10-04T21:12:54.690 回答
2

my $array=@_;是不正确的,你应该使用my $array=shift;或结合使用my ($len, $array) = @_;

您通过说 获得了一个标量值@_(即其中的元素数)$array=@_;

于 2013-10-04T21:12:45.890 回答