【问题标题】:Dereferencing array in a subroutine在子例程中取消引用数组
【发布时间】:2013-10-12 00:27:36
【问题描述】:

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

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.

【问题讨论】:

  • 为什么要否决这个问题?

标签: arrays perl subroutine


【解决方案1】:

my $array=@_;不正确,应使用my $array=shift;或合并使用my ($len, $array) = @_;

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

【讨论】:

    【解决方案2】:

    将您的代码更改为:

    #!/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";
      }
    

    【讨论】:

      【解决方案3】:

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

      所以当你说

      my $array = @_;
      

      $array 的值是数字 1,因为@_ 里面有一个东西。 (你已经shifted 关闭了第一个标量。)

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

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

      我喜欢中间选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-06
        • 2023-04-02
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2014-07-04
        相关资源
        最近更新 更多