如何在perl中的子程序中操作数组引用

时间:2017-08-07 09:49:57

标签: arrays perl reference

我通过引用传递数组子程序:

command = 'top -bn 1'

但是在调用子程序之后数组仍然是空的,我试过了:

my @template_ops;
handle_templates_with_post_mod(\@template_ops);

sub handle_templates_with_post_mod
{
    my @my_template_ops    = @{$_[0]};
    unshift (@my_template_ops), 'O';
}

但我收到此错误:sub handle_templates_with_post_mod { my $my_template_ops = shift; unshift (@$my_template_ops), 'O'; }

2 个答案:

答案 0 :(得分:4)

四个问题:

  1. 始终开启use strict; use warnings;

  2. 然后unshift (@$my_template_ops), 'O';会产生Useless use of unshift with no values at ./t.pl line 17.。 您已将错误设置为()。写下unshift (@$my_template_ops, 'O');或者完全不让它们离开:unshift @$my_template_ops, 'O';

  3. 代码my @my_template_ops = @{$_[0]};生成所提供数组引用的副本,您正在操作副本。因此,您没有在顶层看到效果。

  4. 您的函数的第二个版本可以正常运行,因为您对提供的数组引用进行操作,并为unshift调用取消引用它。

  5. 工作版:

    use strict;
    use warnings;
    use Data::Dumper;
    
    my @template_ops;
    handle_templates_with_post_mod(\@template_ops);
    
    print Data::Dumper::Dumper( \@template_ops );
    
    sub handle_templates_with_post_mod
    {
        my $my_template_ops    = shift;
        unshift @$my_template_ops, 'O';
    }
    

    输出:

    $VAR1 = [
              'O'
            ];
    

答案 1 :(得分:2)

当您为取消引用的数组指定名称时,它将成为副本。要操作数组引用并影响原始数组,您需要将其用作引用,或者取消引用它而不给它新名称(使用@运算符取消引用)。

my $arrayRef = ...;
push @{$arrayRef}, 42;
my $hashRef = ...;
delete $hashRef->{key};