我通过引用传递数组子程序:
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';
}
答案 0 :(得分:4)
四个问题:
始终开启use strict; use warnings;
然后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';
代码my @my_template_ops = @{$_[0]};
生成所提供数组引用的副本,您正在操作副本。因此,您没有在顶层看到效果。
您的函数的第二个版本可以正常运行,因为您对提供的数组引用进行操作,并为unshift
调用取消引用它。
工作版:
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};